我有一个在工作日(周一至周五)运行的 ssis 套餐。如果我在星期二收到文件,后台(DB),它需要前一个工作日的日期并进行一些交易。如果我在周五运行该作业,它必须获取周一的日期并处理交易。
我使用以下查询来获取之前的营业日期
Select Convert(varchar(50), Position_ID) as Position_ID,
TransAmount_Base,
Insert_Date as InsertDate
from tblsample
Where AsOfdate = Dateadd(dd, -1, Convert(datetime, Convert(varchar(10), '03/28/2012', 101), 120))
Order By Position_ID
如果我执行此查询,我将获得昨天交易的结果。如果我在星期一运行相同的查询,它必须获取星期五的交易而不是星期日的交易。
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 设置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)