SELECT DATEADD(DAY, CASE DATENAME(WEEKDAY, GETDATE())
WHEN 'Sunday' THEN -2
WHEN 'Monday' THEN -3
ELSE -1 END, DATEDIFF(DAY, 0, GETDATE()))
我更喜欢将其DATENAME
用于类似这样的事情,DATEPART
因为它消除了对设置的需要,DATEFIRST
并确保本地计算机上时间/日期设置的变化不会影响结果。最后DATEDIFF(DAY, 0, GETDATE())
将消除时间部分,GETDATE()
消除了需要转换为varchar的过程(速度要慢得多)。
这个答案很早就在我的职业生涯中,每次都被投票否决让我很烦,因为我不再同意使用DATENAME的想法。
更为有效的解决方案是:
SELECT DATEADD(DAY, CASE (DATEPART(WEEKDAY, GETDATE()) + @@DATEFIRST) % 7
WHEN 1 THEN -2
WHEN 2 THEN -3
ELSE -1
END, DATEDIFF(DAY, 0, GETDATE()));
这将适用于所有语言和DATEFIRST设置。