Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 需要一些DateDiff计算从周一开始的一周_Sql Server_Tsql - Fatal编程技术网

Sql server 需要一些DateDiff计算从周一开始的一周

Sql server 需要一些DateDiff计算从周一开始的一周,sql-server,tsql,Sql Server,Tsql,我有以下的T-SQL。我试图用它来计算一周开始的日期。我需要从周一开始我的一周: SET DATEFIRST 1 -- Monday (First Week day) DECLARE @dt DATETIME2 SELECT DATEADD(week, (-1) * (datepart(dw, @dt) - 1), @dt) AS datetime2--(7) DECLARE @SchDT Datetime DECLARE @TstPeriod varchar(20) SET @TstPe

我有以下的T-SQL。我试图用它来计算一周开始的日期。我需要从周一开始我的一周:

SET DATEFIRST 1 -- Monday (First Week day)

DECLARE @dt DATETIME2

SELECT DATEADD(week, (-1) * (datepart(dw, @dt) - 1), @dt) AS datetime2--(7)

DECLARE @SchDT Datetime
DECLARE @TstPeriod varchar(20)
SET @TstPeriod = 'Week'

IF @TstPeriod = 'Month'
    SET @SchDT = cast(DATEADD(Month, DATEDIFF(month,0,GETDATE()),-1) as datetime2(7))

IF @TstPeriod = 'Week'
    SET @SchDT = cast(DATEADD(week, DATEDIFF(week,0,GETDATE()),-1) as datetime2(7))

SELECT @SchDT
直到这之后,我才意识到SQL Server将一周的开始时间视为周日——不管发生什么

有没有人遇到过类似的需求,可以分享如何使用星期一作为一周的开始,让SQL Server计算
datediff()


非常感谢

这应该是你约会的那周的星期一了

SELECT CONVERT(DATE,DATEADD(day,-DATEPART(weekday,@dt)+2,@dt))
应该给你这个星期的星期一

这相当于:

SELECT DATEADD(WEEK, DATEDIFF(WEEK, '1900-01-01', GETDATE()), '1900-01-01')
自1900年1月1日以来,星期一是一个多星期的星期一


正如Shnugo所指出的,如果
getdate()
返回一个星期天,那么它实际上将应用于下一个星期一。您可以使用函数检查今天是哪一天,并根据需要操纵日期

使用
DATENAME
的示例:


选择DATEADD(WEEK,DATEDIFF(WEEK,'1900-01-01',DATENAME(WEEKDAY,GETDATE())='Sunday'时的大小写,然后选择DATEADD(DAY,-1,GETDATE())或GETDATE()结束时的大小写,'1900-01-01')
您不应该对整个批次使用
设置日期优先
(或
设置语言
)。这可能有各种意想不到的副作用

@@DATEFIRST
,将一周的第一天反映为
INT
值。使用此选项独立地计算您的值

--您可以检查差异

SET LANGUAGE GERMAN;
SELECT @@DATEFIRST; 
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST; 
--我设置了一个变量

DECLARE @d DATETIME=GETDATE();
--另一个答案中类似于简单计算的建议将根据系统的文化返回不同的日期

SET LANGUAGE GERMAN;
SELECT DATEADD(DAY,-DATEPART(WEEKDAY,@d)+2,@d);
SET LANGUAGE ENGLISH;
SELECT DATEADD(DAY,-DATEPART(WEEKDAY,@d)+2,@d);
--但是使用
@@DATEFIRST
可以在计算中得到一个校正项

SET LANGUAGE GERMAN;
SELECT DATEADD(DAY,-((DATEPART(WEEKDAY,@d) + @@DATEFIRST + 5) % 7),@d);
SET LANGUAGE ENGLISH;
SELECT DATEADD(DAY,-((DATEPART(WEEKDAY,@d) + @@DATEFIRST + 5) % 7),@d);

可能重复的提示:
GetDate()
在查询中被处理得有点奇怪。每个实例在查询中都有一个常量值。例如,从SomeTable中选择GetDate()作为D1,将GetDate()作为D2,这两个列可能会返回两个不同的值,但它们不会因行而异。当使用对
GetDate()
的多个调用时,无论是在单个语句还是在多个语句中,都可以通过获取单个值并在整个过程中使用它来避免有趣的惊喜,即
将@Now声明为DateTime=GetDate()
并根据需要立即使用
@Now
。我意识到SQL Server会将一周的开始时间视为周日——无论发生什么情况。不,不管怎样。这是与文化有关的…比我的答案更好,我知道这个把戏好几个月了,不知道我的大脑去了哪里。看起来OP非常接近,只需要将他的-1更改为0,他就会好起来。是的,但我绝对推荐第二种形式,因为它更能自我记录。我只是比较了你的解决方案(我非常喜欢)和我的解决方案,发现两者速度一样快。但是,由于偶然性,我遇到了一个缺陷:尝试此
选择DATEADD(WEEK,DATEDIFF(WEEK,'1900-01-01','2018-04-01'),'1900-01-01')
。周日你会得到下周一的答案…@Zorkolot,你的编辑很有效。但是解决方案的优雅不知何故消失了:-D并且有一个很大的缺陷:这取决于文化/语言。在我的环境中,“星期天”是“桑塔格”…@Shnugo非常有趣Shnugo!我已经测试过了,它确实改变了
DATEPART
设置语言英语谢谢大家,谢谢你,Shnugo。最后一个使用@DATEFIRST的方法似乎完全符合我的要求,并返回给定星期的星期一的日期。我很感激!
SET LANGUAGE GERMAN;
SELECT DATEADD(DAY,-((DATEPART(WEEKDAY,@d) + @@DATEFIRST + 5) % 7),@d);
SET LANGUAGE ENGLISH;
SELECT DATEADD(DAY,-((DATEPART(WEEKDAY,@d) + @@DATEFIRST + 5) % 7),@d);