【问题标题】:Select returns results from last day, on mondays doesn´t return friday选择返回最后一天的结果,星期一不返回星期五
【发布时间】:2019-07-12 23:11:03
【问题描述】:

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

当日期时间为星期一时,我尝试返回 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()))

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

【问题讨论】:

  • CONVERT(datetime, 'Dy')?您希望 文字字符串 'dy' 代表什么日期?

标签: sql sql-server date select


【解决方案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 这样的面具。

【讨论】:

    【解决方案2】:

    这没有意义:

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

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

    这不是转换的工作方式。我想你想要:

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

    【讨论】:

      猜你喜欢
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多