我有一个选择返回前一天的结果。一切都很好但是,来到星期一,它返回星期日的结果,我需要它返回前一个星期五的结果。
当日期时间是星期一时,我试图回去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()))
我刚刚得到转换错误,不明白为什么
你的问题是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
等面具。
这没有意义:
case convert(datetime, 'Dy') when 'Mon'
您正在将字符串'Dy'
转换为日期时间,然后将其与不是日期时间的字符串进行比较。
这不是转换的工作原理。我想你想要:
case datename('Dy', getdate()) when 'Monday' . . .