[英]Why does SQL Server dateadd datediff behave behave this way when using weeks
當使用dateadd/datdiff
技巧進行日期dateadd/datdiff
整時,我總是會在幾天和幾個月的時間里得到非常可預知和可以理解的結果。 我現在已經是數周以來第一次使用它,並且遇到了一些我沒想到的事情。
2015年7月19日至26日似乎轉移到我認為的下周。 下面的示例說明了第二列中的實際行為和第三列中的預期行為。 我試圖了解為什么和有什么區別。
declare @n as table ([N] [int] )
insert into @n ( [N] ) values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15)
select n
, dateadd(dd,n,'2015-jul-17')
, dateadd(wk,datediff(wk,0, dateadd(dd,n,'2015-jul-17') ),0)
, dateadd(dd,datediff(dd,0, dateadd(dd,n,'2015-jul-17') )/7*7,0)
from @n
order by n
問題是使用星期天作為星期的開始日期而不是星期一的DATEDIFF()
。
訣竅是-1:
declare @n as table ([N] [int])
declare @start datetime = '1900-01-01'
insert into @n ( [N] ) values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15)
select n
, dateadd(dd,n,@start) as [Date]
,dateadd(wk,datediff(wk,0, dateadd(dd,n,@start) -1 ),0) as [WeekStart (by WeekDiff)]
,dateadd(dd,datediff(dd,0, dateadd(dd,n,@start) )/7*7,0) as [WeekStart (by DayDiff)]
, datediff(wk,0, dateadd(dd,n,@start)) [WeekDiff]
from @n
order by n
編輯
結合使用DATEPART(WEEKDAY)
和SET DATEFIRST 1
SET DATEFIRST 1
;with dates(value) as (select convert(date, dateadd(dd,n,@start)) from @n)
select *, DATEADD(Day, -DATEPART(WEEKDAY, value) + 1, value) from dates
將此日期舍入算法翻譯成英語,其措詞如下:
在日歷的開頭(第0天)添加[時間單位]的數量
其中[時間單位]是年/月/日/小時等。..在T-SQL中,日歷的開始是1900/01/01 00:00:00。
1900/01/01是一個星期一。
因此,您要將整周數添加到星期一。 因此,本周總是四舍五入為星期一。 這會將7/19和7/26(星期日)扔到周末。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.