我有一个选择,可以返回前一天的结果。一切都很好,但是,到了星期一,它返回星期天的结果,而我需要它返回以前的星期五结果。
我试图回溯日期时间为星期一的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()))
我到处都是转换错误,不知道为什么
答案 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.
避免使用名称(例如Monday
,March
,Jan
等名称)进行日期检查,这可能会根据所配置的语言而改变。 (我认为)您要搜索的正确表格是
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
之类的蒙版。