SQL将日期“舍入”为一周中的给定日期

时间:2019-03-20 16:41:23

标签: sql sql-server tsql date

我的公司将所有任务分为几个星期,每个星期四结束。因此,将3/20/19到期的任务分为3/21周,将3/22到期的任务分为3/28/19周。

我正在根据输入的到期日来计算此字段(称为Duedate_Weekdue)。

以下方法可行,但似乎不是最简单的方法。有人有更优雅的方法吗?

Select 
getdate() as duedate,
datepart(yy,getdate()) as duedate_yr,
datepart(ww,getdate()) as duedate_ww,
CASE
    When datename(dw,Dateadd(day,1,getdate()))='Thursday' Then Dateadd(day,1,getdate())
    When datename(dw,Dateadd(day,2,getdate()))='Thursday' Then Dateadd(day,2,getdate())
    When datename(dw,Dateadd(day,3,getdate()))='Thursday' Then Dateadd(day,3,getdate())
    When datename(dw,Dateadd(day,4,getdate()))='Thursday' Then Dateadd(day,4,getdate())
    When datename(dw,Dateadd(day,5,getdate()))='Thursday' Then Dateadd(day,5,getdate())
    When datename(dw,Dateadd(day,6,getdate()))='Thursday' Then Dateadd(day,6,getdate())
    When datename(dw,Dateadd(day,0,getdate()))='Thursday' Then Dateadd(day,0,getdate())
END as duedate_Weekdue;

3 个答案:

答案 0 :(得分:1)

您可以将其简化为使用一点数学和一些SQL Engine琐事的代码行。

取决于DATEPART的答案将返回不确定的结果,具体取决于DATEFIRST的设置,该结果告诉SQL Engine一周中的哪一天优先作为 星期几。

有一种方法可以做您想要的事情,而不会因更改DATEFIRST设置而导致得到错误的结果。

在SQL Server内部,第0天是1900年1月1日,恰好是星期一。我们都使用了这个小技巧,通过计算自第0天起的天数,然后将该数字添加到第0天以获取今天的午夜时间,来减少GETDATE()的时间:

SELECT DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()),0)

同样,第3天是1900年1月4日。这很重要,因为那天是星期四。对天数进行一些数学运算,然后依靠DATEDIFF函数删除分数,此计算将始终为您返回下一个星期四:

SELECT DATEADD(DAY, (DATEDIFF(DAY, 3, GETDATE())/7)*7 + 7,3);

this answer寻求帮助。

因此您的最终查询归结为:

Select 
getdate() as duedate,
datepart(yy,getdate()) as duedate_yr,
datepart(ww,getdate()) as duedate_ww,
DATEADD(DAY, (DATEDIFF(DAY, 3, GETDATE())/7)*7 + 7,3) as duedate_Weekdue;

答案 1 :(得分:0)

尝试使用DATEPART确定一周中的天数,然后添加足够的天数以转到下一个星期四:

declare @dt date = '2019-03-22'
declare @weekDay int

SELECT @weekDay =  DATEPART(dw, @dt)  

if @weekDay <= 5 
    select DATEADD(day, 5 - @weekDay ,@dt)
else
    select DATEADD(day,  12 - @weekDay  ,@dt)

答案 2 :(得分:0)

如果一周的第一天是星期日,则使用模运算符startX

x = startX + ((i - 5) * 1.875)
x = startX + ((i - 10) * 1.875)

我还将结果的转换应用于%