选择从最后一天返回结果,星期一不返回星期五

问题描述 投票:2回答:2

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

当日期时间是星期一时,我试图回去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()))

我刚刚得到转换错误,不明白为什么

sql sql-server date select
2个回答
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而不是DWMONTH而不是M等)。你无法摆脱yyyy-MM-dd等面具。


1
投票

这没有意义:

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

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

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

case datename('Dy', getdate()) when 'Monday' . . . 
© www.soinside.com 2019 - 2024. All rights reserved.