mes*_*nde 3 sql t-sql sql-server date
我的公司将所有任务分组到各个周中,并在周四结束。因此,2019 年 3 月 20 日到期的任务将被分组到 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;
Run Code Online (Sandbox Code Playgroud)
您可以将其简化为一行代码,使用一点数学知识和一些 SQL 引擎琐事。
依赖的答案会DATEPART返回非确定性结果,具体取决于 的设置DATEFIRST,该设置告诉 SQL 引擎将一周中的哪一天视为一周的第一天。
有一种方法可以做您想做的事情,而无需担心因设置更改而得到错误结果的风险DATEFIRST。
在 SQL Server 内部,第 0 天是 1900 年 1 月 1 日,恰好是星期一。我们都使用过这个小技巧,GETDATE()通过计算从第 0 天开始的天数,然后将该数字添加到第 0 天,即可得到今天午夜的日期:
SELECT DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()),0)
Run Code Online (Sandbox Code Playgroud)
同样,第 3 天是 1900 年 1 月 4 日。这是相关的,因为那天是星期四。对天数进行一些数学计算,并依靠DATEDIFF函数删除分数(它确实这样做了),此计算将始终为您返回下周四:
SELECT DATEADD(DAY, (DATEDIFF(DAY, 3, GETDATE())/7)*7 + 7,3);
Run Code Online (Sandbox Code Playgroud)
感谢此答案的帮助。
所以你的最终查询可以归结为:
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3504 次 |
| 最近记录: |