我的公司将所有任务分为几个星期,每个星期四结束。因此,将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;
答案 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)
我还将结果的转换应用于%
。