WHERE语句选择前一天的记录,但当当前日期为星期一时选择星期五记录Microsoft SQL

时间:2019-03-22 09:41:45

标签: sql sql-server date where-clause getdate

我需要一个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子句:

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以尝试一下。

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

答案 1 :(得分:0)

这是一种略微“神奇”的方法来计算不依赖于任何特定服务器设置(例如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行。