【问题标题】:WHERE statement to choose record previous day but choose Friday record when current day is Monday Microsoft SQLWHERE 语句选择记录前一天,但当当天是星期一时选择星期五记录 Microsoft SQL
【发布时间】:2019-03-22 09:41:45
【问题描述】:

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

【问题讨论】:

  • 你根本就没有公共假期吗?通常此时您应该考虑工作日,而不是像“周一至周五全天都是工作日”这样的简单规则。此时,您通常希望创建一个日历表,而不是尝试即时计算这些内容。

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


【解决方案1】:

这是一种不依赖于任何特定服务器设置(例如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 行。

【讨论】:

    【解决方案2】:

    你可以试试这个。

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

    【讨论】:

    • 成功了! :) 好吧,它带回了昨天的结果,但这比我用我的代码得到的结果要远。当然,我要到星期一才能测试,但它看起来不错。非常感谢。我整个星期都在为此烦恼
    • @ACC - 使用特定的星期一日期查找并替换 GETDATE() 对于快速测试功能应该不会太难。
    猜你喜欢
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多