admin

如何使用sql server获取一周中的上一个工作日与当前工作日的工作日

sql

我有一个在工作日(周一至周五)运行的sis软件包。如果我在星期二(background(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

如果我执行此查询,我将获得昨天的Transactios的结果。如果我在星期一运行相同的查询,则必须获取星期五的交易而不是星期日。


阅读 402

收藏
2021-05-10

共1个答案

admin

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的过程(速度要慢得多)。


编辑(将近2年)

这个答案很早就在我的职业生涯中,每次都被投票否决让我很烦,因为我不再同意使用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设置。

2021-05-10