WHERE 语句选择前一天记录,当今天是周一时选择周五记录 Microsoft SQL

WHERE statement to choose record previous day but choose Friday record when current day is Monday Microsoft SQL

我需要一个 WHERE 声明,其中记录的日期是前一天。我有下面的代码可以做到这一点

WHERE DOC_DATE =  dateadd(day,datediff(day,1,GETDATE()),0) 

但是当今天是星期一时,我需要这个语句来获取星期五的记录。我有以下代码,但它对我不起作用。 SQL 上没有返回错误,尽管也没有返回记录结果。我有下面的代码

WHERE DOC_DATE = DATEADD(day, CASE WHEN datepart(dw,(GETDATE())) IN (2) then -3 ELSE -1 END ,0)

重要的是要补充一点,这需要在 WHERE 子句中。这是我正在创建的 Docuware 管理视图。我无法控制如何编写 SELECT 语句,我只能编辑 WHERE 子句:

你可以试试这个。

WHERE DOC_DATE = DATEADD(DAY, CASE WHEN datepart(dw, GETDATE()) = 2 THEN -3 ELSE -1 END, CAST(GETDATE() AS DATE)) 

这里有一个稍微 "magical" 的方法来计算不依赖于任何特定服务器设置的值,例如 datefirst。它的工作原理可能不是很明显:

WHERE DOC_DATE = dateadd(day,datediff(day,'20150316',getdate()),
CASE WHEN DATEPART(weekday,getdate()) = DATEPART(weekday,'20150330')
    THEN '20150313'
    ELSE '20150315' END)

在第一行中,我们正在计算自某个任意日期以来已经过去的天数。我选择了 2015 年 3 月的一天作为我的基准日期。

第二行询问今天是星期几,以及它是否与任意 "Known good" 星期一相同。只取一个值并将其与 2 进行比较取决于您的 DATEFIRST 设置,所以我不想写那个。

在第三行中,我们决定如果是星期一要做什么 - 我给出的日期比上面的任意日期早 3 天。如果不是星期一,我们会选择前一天。

将它们加在一起,当我们将任意日期的天数差加回到第 3 行和第 4 行的这两个日期之一时,它具有将日期向后移动 1 或 3 天的效果。


这可能是一个奇怪的结构,看看您是否不熟悉它 - 但结合 dateadd/datediff 并利用任意日期与根据它计算的其他日期之间的关系可以用于执行各种计算。类似的结构可用于计算,例如15 个月前该月的最后一天,仅使用 dateadd/datediff,一个任意日期和另一个与第一个日期有正确偏移的日期:

SELECT DATEADD(month,DATEDIFF(month,'20010101',GETDATE()),'19991031')

正如我在评论中所说,通常做这种事情离需要正确模拟组织的工作日只有一小步之遥,此时您通常需要引入日历 table.每天一行,20 年的预计算日历(根据业务变化进行必要调整)仍然少于 10000 行。