我需要一个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
子句:
这是一种稍微“神奇”的方式来计算不依赖于任何特定服务器设置(如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月的一天作为我的基准日期。
第二行询问今天的一周是什么,以及它是否与星期一任意的“已知好”相同。只取一个值并将其与2
进行比较取决于你的DATEFIRST
设置是什么,所以我不想写那个。
在第三行,我们决定如果它是星期一该怎么办 - 我给出的日期是我上面的任意日期前3天。如果不是星期一,我们会在前一天选择。
将它们全部加在一起,当我们将任意日期的天差从第3行和第4行添加回这两个日期之一时,它具有将日期向后移动1或3天的效果。
如果你不熟悉它可能是一个奇怪的结构 - 但是结合dateadd
/ datediff
并利用任意日期和从其计算的其他日期之间的关系对于执行各种计算是有用的。类似的结构可用于计算例如15个月前的最后一天使用dateadd
/ datediff
,一个任意日期和另一个日期与第一个正确的偏移:
SELECT DATEADD(month,DATEDIFF(month,'20010101',GETDATE()),'19991031')
正如我在评论中所说的那样,通常做这类事情距离需要对组织的工作日进行正确建模只需很短的一步,此时您通常需要引入日历表。每天一行,20年的预先计算的日历(根据业务变化的需要进行调整)仍然少于10000行。
你可以试试这个。
WHERE DOC_DATE = DATEADD(DAY, CASE WHEN datepart(dw, GETDATE()) = 2 THEN -3 ELSE -1 END, CAST(GETDATE() AS DATE))