选择返回昨天的结果,星期一不返回星期五

时间:2019-02-19 12:30:06

标签: sql sql-server date select

我有一个选择,可以返回前一天的结果。一切都很好,但是,到了星期一,它返回星期天的结果,而我需要它返回以前的星期五结果。

我试图回溯日期时间为星期一的3天,但无法正常工作。

这是我开始的地方

SELECT no, nome, obrano, datafinal  
    FROM bo
    WHERE nmdos LIKE '%preço%'
    AND datafinal = DATEADD(day, -1, CONVERT(date, GETDATE()))

这是我在的地方

SELECT no, nome, obrano, datafinal  
    FROM bo
    WHERE nmdos LIKE '%preço%'
    AND datafinal = DATEADD(day, - case convert (datetime, 'Dy') when 'Mon' then 3 else 1 end, CONVERT(date, GETDATE()))

我到处都是转换错误,不知道为什么

2 个答案:

答案 0 :(得分:1)

这没有道理:

case convert(datetime, 'Dy') when 'Mon'

您要将字符串'Dy'转换为日期时间,然后将其与非日期时间的字符串进行比较。

那不是转换的工作原理。我想你想要

case datename('Dy', getdate()) when 'Monday' . . . 

答案 1 :(得分:1)

您的问题是SELECT convert (datetime, 'Dy')。这已经引发了错误:

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

避免使用名称(例如MondayMarchJan等名称)进行日期检查,这可能会根据所配置的语言而改变。 (我认为)您要搜索的正确表格是

SELECT DATENAME(WEEKDAY, GETDATE()) -- Returns 'Tuesday'

更好的解决方案是将DATEFIRST设置为已知值(对于DATEPART WEEKDAY),然后与天数进行比较。您可以使用CASE-1更改为-3

SET DATEFIRST 1 -- 1: Monday, 7: Sunday

SELECT 
    no, 
    nome, 
    obrano, 
    datafinal  
FROM 
    bo
WHERE 
    nmdos LIKE '%preço%' AND 
    datafinal = DATEADD(
        DAY,
        CASE WHEN DATEPART(WEEKDAY, GETDATE()) = 1 -- If today is monday
            THEN -3 ELSE -1 END
        CONVERT(DATE, GETDATE()))

此外,建议编写完整的datepart关键字,以免引起混淆(写WEEKDAY代替DW,写MONTH代替M,等等) 。不过,您无法逃脱yyyy-MM-dd之类的蒙版。