SQL 服务器:获取 ISO 周的日期差异
SQL Server : get datediff for ISO weeks
花了大半天时间来弄清楚这个问题。
我想获取两个日期的 datediff
,基于他们的 ISO 周。
这是我的代码:
SET DATEFIRST 1 ;
DECLARE @A date, @B date;
SET @A = '20180829'; -- August 29th
SET @B = '20180902'; -- September 2nd
SELECT DATEDIFF(WW, @A, @B )
如果你检查:http://whatweekisit.org/(2018 年第 35 周)你可以看到它 运行s 8 月 27 日 到 9 月 2 日。
上面的代码将 return 一个 DateDiff = 1
,它应该是 0。尝试 运行 DateDiff
在 ISO 周只是 return 以下错误:
The datepart iso_week is not supported by date function datediff
我试过从日期中取出周日期部分,但是在比较不同年份的日期时我遇到了问题。
有办法解决这个问题吗?
SELECT DATEDIFF(ww, DATEADD(dd,-1, @A ), DATEADD(dd,-1,@B))
--Seems to do the trick?
取自:
虽然我不明白为什么 link 中的另一个 post 在最后添加一个 1。
所以在阅读了一些之后,没有一种本地方法可以做到这一点。但这里有一个解决方法:
DECLARE @A DATE = '20180829' -- August 29th
DECLARE @B DATE = '20180902' -- September 2nd
--We need to back each date up to the first day of its week.
DECLARE @A_FIRSTWEEKDAY DATE = DATEADD(DAY, -(DATEPART(WEEKDAY, @A) - 1), @A)
DECLARE @B_FIRSTWEEKDAY DATE = DATEADD(DAY, -(DATEPART(WEEKDAY, @B) - 1), @B)
/*The WEEKDAY part counts Sunday as day 1. If the original date was
a Sunday, it backed up zero days and it still needs to back up six
days. If it was any other day, it backed all the way up to Sunday
and now it needs to move forward one day.*/
IF DATEPART(WEEKDAY, @A) = 1
BEGIN SET @A_FIRSTWEEKDAY = DATEADD(DAY, -6, @A_FIRSTWEEKDAY) END
ELSE BEGIN SET @A_FIRSTWEEKDAY = DATEADD(DAY, 1, @A_FIRSTWEEKDAY) END
IF DATEPART(WEEKDAY, @B) = 1
BEGIN SET @B_FIRSTWEEKDAY = DATEADD(DAY, -6, @B_FIRSTWEEKDAY) END
ELSE BEGIN SET @B_FIRSTWEEKDAY = DATEADD(DAY, 1, @B_FIRSTWEEKDAY) END
--Now we can just difference the weeks.
SELECT DATEDIFF(DAY, @A_FIRSTWEEKDAY, @B_FIRSTWEEKDAY) / 7
这是因为 DATEDIFF
始终使用星期日作为一周的第一天,以确保函数以确定性方式运行:https://docs.microsoft.com/datediff-transact-sql
所以20180902
(星期日)是下周的第一天。
花了大半天时间来弄清楚这个问题。
我想获取两个日期的 datediff
,基于他们的 ISO 周。
这是我的代码:
SET DATEFIRST 1 ;
DECLARE @A date, @B date;
SET @A = '20180829'; -- August 29th
SET @B = '20180902'; -- September 2nd
SELECT DATEDIFF(WW, @A, @B )
如果你检查:http://whatweekisit.org/(2018 年第 35 周)你可以看到它 运行s 8 月 27 日 到 9 月 2 日。
上面的代码将 return 一个 DateDiff = 1
,它应该是 0。尝试 运行 DateDiff
在 ISO 周只是 return 以下错误:
The datepart iso_week is not supported by date function datediff
我试过从日期中取出周日期部分,但是在比较不同年份的日期时我遇到了问题。
有办法解决这个问题吗?
SELECT DATEDIFF(ww, DATEADD(dd,-1, @A ), DATEADD(dd,-1,@B))
--Seems to do the trick?
取自:
虽然我不明白为什么 link 中的另一个 post 在最后添加一个 1。
所以在阅读了一些之后,没有一种本地方法可以做到这一点。但这里有一个解决方法:
DECLARE @A DATE = '20180829' -- August 29th
DECLARE @B DATE = '20180902' -- September 2nd
--We need to back each date up to the first day of its week.
DECLARE @A_FIRSTWEEKDAY DATE = DATEADD(DAY, -(DATEPART(WEEKDAY, @A) - 1), @A)
DECLARE @B_FIRSTWEEKDAY DATE = DATEADD(DAY, -(DATEPART(WEEKDAY, @B) - 1), @B)
/*The WEEKDAY part counts Sunday as day 1. If the original date was
a Sunday, it backed up zero days and it still needs to back up six
days. If it was any other day, it backed all the way up to Sunday
and now it needs to move forward one day.*/
IF DATEPART(WEEKDAY, @A) = 1
BEGIN SET @A_FIRSTWEEKDAY = DATEADD(DAY, -6, @A_FIRSTWEEKDAY) END
ELSE BEGIN SET @A_FIRSTWEEKDAY = DATEADD(DAY, 1, @A_FIRSTWEEKDAY) END
IF DATEPART(WEEKDAY, @B) = 1
BEGIN SET @B_FIRSTWEEKDAY = DATEADD(DAY, -6, @B_FIRSTWEEKDAY) END
ELSE BEGIN SET @B_FIRSTWEEKDAY = DATEADD(DAY, 1, @B_FIRSTWEEKDAY) END
--Now we can just difference the weeks.
SELECT DATEDIFF(DAY, @A_FIRSTWEEKDAY, @B_FIRSTWEEKDAY) / 7
这是因为 DATEDIFF
始终使用星期日作为一周的第一天,以确保函数以确定性方式运行:https://docs.microsoft.com/datediff-transact-sql
所以20180902
(星期日)是下周的第一天。