我需要获取某些日期集的周数。例如,对于 2016 年 1 月,它应该类似于:
[Week Number]
53 <--- for dates from Jan 1 to Jan 2
1 <--- for dates from Jan 3 to Jan 9
2 <--- for dates from Jan 10 to Jan 16
... <--- etc.
Run Code Online (Sandbox Code Playgroud)
如您所见,一周应该从星期日开始。我使用以下函数来设置开始日期:
SET DATEFIRST 7
Run Code Online (Sandbox Code Playgroud)
这是获取周数的一个:
DATEPART(ISOWK, SOME_DATE)
Run Code Online (Sandbox Code Playgroud)
但我注意到这DATEFIRST不会影响ISOWK使用时的结果 - 周总是从星期一开始。
那么,我做错了什么?谢谢你!
更新:
我做了一个功能,看起来效果很好:
CREATE FUNCTION [dbo].[GetWeekNumber]
(
@date as DATETIME,
@offset as INT
)
RETURNS NVARCHAR(100)
BEGIN
DECLARE @weekNumber as int
DECLARE @year as …Run Code Online (Sandbox Code Playgroud) 我有这样的表结构:
CREATE TABLE Department
(
[IdDepartment] int,
[Name] varchar(23),
[IdUser] int,
[CreateDate] datetime
);
INSERT INTO Department ([IdDepartment], [Name], [IdUser], [CreateDate])
VALUES
(1, 'Sales', 3, '2016-01-15 17:00:00.000'),
(2, 'Finance', null, '2016-01-13 18:00:00.000' ),
(3, 'Accounting' , 5, '2016-03-21 22:00:00.000'),
(4, 'IT' ,3, '2016-03-21 17:00:00.000'),
(5, 'Secretary',null, '2016-03-21 17:00:00.000'),
(6, 'Sport',3, '2016-02-20 16:00:00.000');
Run Code Online (Sandbox Code Playgroud)
我想运行这个查询:
select Name
from Department
where CreateDate = '2016-03-21'
Run Code Online (Sandbox Code Playgroud)
结果返回 0 行。
我认为这是因为表结构中的日期是日期时间,但我尝试这样做,但两者都不适合我:
select Name
from Department
where CreateDate like '%2016-03-21%'
Run Code Online (Sandbox Code Playgroud)
结果应该是这样的:
Name
-----
Accounting …Run Code Online (Sandbox Code Playgroud) 我试图找到这个表中最小的缺失数字。
+------+--------+
| id | number |
+------+--------+
| 902 | 1 |
| 908 | 2 |
| 1007 | 7 |
| 1189 | 8 |
| 1233 | 12 |
| 1757 | 15 |
+------+--------+
Run Code Online (Sandbox Code Playgroud)
在数字列中,您可以看到数字之间有几个间隙。我需要得到最小间隙之后的数字。所以在上面的例子中我需要数字 3。因为 2 是间隙后的最小数字。
我有两个 SQL Server 表:
表格1
Id name description version
----------------------------------
1 Book1 Book 1 Title v1
2 Book2 Book 2 Title v2
3 Book3 Book 3 Title NULL
4 Book5 Book 5 Title v3
Run Code Online (Sandbox Code Playgroud)
表2
Id name description version
----------------------------------
1 Book1 Book 1 Title v1
2 Book2 Book 2 Title v2
3 Book3 Book 3 Title NULL
4 Book4 Book 4 Title NULL
5 Book5 Book 5 Title NULL
Run Code Online (Sandbox Code Playgroud)
我想从表 2 中选择表 1 中不存在的所有数据,以便将它们插入到另一个表中。
这是 SQL 查询:
SELECT t2.name, …Run Code Online (Sandbox Code Playgroud) 我正在对表中的一行进行 MS SQL Server 更新,这非常简单。我正在用另外 4 件东西替换大约 4 件东西。
update Table set Column1 = 'something new' where Column1 = 'something old';
update Table set Column1 = 'something new 2' where Column1 = 'something old 2';
update Table set Column1 = 'something new 3' where Column1 = 'something old 3';
update Table set Column1 = 'something new 4' where Column1 = 'something old 4';
Run Code Online (Sandbox Code Playgroud)
这就是全部内容了。但我的问题是,这是一个在生产中运行的包含大量记录的表,但在运行更新之前确切的数量是未知的。有一个时间戳列。首先更新最新的可能更重要。
但我的问题可能是一个更实际的问题。
最好按时间戳对其进行分区并让它手动运行,还是有更好的方法让它运行?我还可以按每个更新语句来划分工作。
或者有什么方法可以将这样的东西放入脚本本身吗?
我尝试查看查询计划,但它没有告诉我拆分查询的最佳方法。
sql sql-server optimization query-optimization sql-server-2014
我的团队计划从 SQL Server 2014 迁移到 2016。目前,SSIS 包是在 VS 2013 中创建的,并部署在 SQL Server 2014 上。为了测试,我尝试在 SSMS 17.3(集成服务 13.0)中部署该包。该包已成功部署,但当我尝试验证该包时,出现以下错误:
在阅读了互联网上的一些解决方案后,我从以下路径部署了包:
%ProgramFiles%\Microsoft SQL Server\130\DTS\Binn
Run Code Online (Sandbox Code Playgroud)
包已成功验证(无需修改 ispac 文件)。据我了解,脚本任务是在 VS 2017 中使用 VSTA 主要版本 15 创建的。我尝试在 VS 2015 中打开解决方案,并使用 SQL Server 2017 作为目标服务器重建解决方案。在 SSMS 17.3 上部署包之前,我确保 dtsx 文件包含 15 个 VSTA 主要版本。
验证后,我在 SSMS 17.3 上部署了该包,它使用以下路径:
%ProgramFiles%\Microsoft SQL Server\140\DTS\Binn
Run Code Online (Sandbox Code Playgroud)
我验证了该包,但遇到了同样的错误。根据我的理解,如果我通过选择 SQL Server 2017 作为目标版本来构建解决方案,它应该能够成功验证。如果我想使用SSMS 17.3进行部署,如何解决这个问题?
sql-server ssis visual-studio sql-server-2014 sql-server-2016
我到处搜索但找不到答案,你能设置变量的排序规则吗?根据MS 文档,似乎只能在 SQL Azure 上实现:
-- Azure SQL 数据仓库和并行数据仓库的语法
DECLARE
{{ @local_variable [AS] data_type } [ =value [ COLLATE ] ] } [,...n]
目前我必须这样做:
DECLARE @Test nvarchar(10) = N'Crud';
IF ( @Test = N'Crud' COLLATE Latin1_General_CS_AI )
Print N'Crud';
IF ( @Test = N'cRud' COLLATE Latin1_General_CS_AI )
Print N'cRud';
IF ( @Test = N'crUd' COLLATE Latin1_General_CS_AI )
Print N'crUd';
IF ( @Test = N'cruD' COLLATE Latin1_General_CS_AI )
Print N'cruD';
Run Code Online (Sandbox Code Playgroud)
当我想做的是这样的时候:
DECLARE @Test nvarchar(10) = N'Crud' COLLATE Latin1_General_CS_AI;
IF …Run Code Online (Sandbox Code Playgroud) 我的存储过程结构如下所示,我收到一个错误
关键字'BEGIN'附近的语法不正确.
如果我删除BEGIN TRAN和COMMIT TRAN语句然后存储过程运行正常.我不确定我做错了什么.任何人都可以帮助我理解什么是错的,什么应该是正确的方法?
Create PROCEDURE proc_name(param1,param2,param3)
AS
Begin
with cte(col1, col2, col3)
AS
(
Select col1
,col2
,col3
from table1
)
Begin Tran
Update table2
set col1 = 'text'
from table2 inner join cte on cte.hmy = table2.hmy
where some condition
update table3
set date = ''
from table3 inner join cte on cte.hmy = table3.hmy
where some different condition
COMMIT TRAN
END
Run Code Online (Sandbox Code Playgroud)
PS请忽略查询逻辑.我尝试通过删除业务逻辑来简化代码.
我有一个数据,其中日期和时间以yyyymmdd_time(20161012_1528)格式出现.
我想将它转换为SQL Server DB中的日期时间为2016-10-12 15:28:00:00
有没有直接的方法来做到这一点.还是要创建一个自定义函数?
嘿所有我希望有人有一个脚本,有助于批量
说我有这样一张桌子:
CREATE TABLE [dbo].[Table_3](
[value1] [varchar](50) NOT NULL,
[value2] [varchar](50) NOT NULL,
[value3] [varchar](50) NOT NULL,
[value4] [nchar](10) NOT NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
而不是NOT NULL我想为值(又名'')输入一个空白.
现在我知道它可以这样做:
ALTER TABLE [dbo].[Table_3] ADD CONSTRAINT [DF_Table_3_value1] DEFAULT ('') FOR [value1]
GO
ALTER TABLE [dbo].[Table_3] ADD CONSTRAINT [DF_Table_3_value2] DEFAULT ('') FOR [value2]
GO
etc...
Run Code Online (Sandbox Code Playgroud)
但是我不想为每个列手动执行此操作,因为我的一些表有100多列.
是否有任何类型的查询将循环遍历我的所有列并将它们设置为我的默认值('')?
sql-server ×10
sql-server-2014 ×10
sql ×5
t-sql ×4
datetime ×2
date ×1
optimization ×1
ssis ×1
ssms ×1