SQL查询问题:周一需返回周五数据而非周日,调整语句遇转换错误
问题分析与解决方案
你的问题出在convert (datetime, 'Dy')这部分——'Dy'是SQL Server里的日期格式符,用来指定返回星期几的缩写,但你不能直接把它转换成datetime类型,这就是导致转换错误的原因。我们需要的是获取当前日期对应的星期几,而不是转换一个格式字符串。
下面给你两种可行的修正方案,适配不同的场景:
方案一:用星期名称判断(适合对应语言环境)
如果你的SQL Server实例是英文环境,周一的名称是'Monday',可以用DATENAME(weekday, GETDATE())来获取当前星期的全称,再通过CASE分支处理:
SELECT no, nome, obrano, datafinal FROM bo WHERE nmdos LIKE '%preço%' AND datafinal = DATEADD(day, CASE DATENAME(weekday, GETDATE()) WHEN 'Monday' THEN -3 -- 周一回退3天到上周五 ELSE -1 -- 其他日期回退1天 END, CONVERT(date, GETDATE()) );
如果你的SQL Server是葡萄牙语环境(因为你的查询里有preço这类葡语词汇),周一的名称是'Segunda-feira',只需要把CASE里的判断值改成对应的葡语星期名称即可:
SELECT no, nome, obrano, datafinal FROM bo WHERE nmdos LIKE '%preço%' AND datafinal = DATEADD(day, CASE DATENAME(weekday, GETDATE()) WHEN 'Segunda-feira' THEN -3 ELSE -1 END, CONVERT(date, GETDATE()) );
方案二:用星期数字判断(避免语言环境影响)
如果你担心不同语言环境下星期名称不一致的问题,可以用DATEPART(weekday, GETDATE())获取星期对应的数字。SQL Server默认DATEFIRST设置为7(即周日是1,周一是2),所以可以直接判断数字:
-- 先确保DATEFIRST设置(可选,避免环境差异) SET DATEFIRST 7; SELECT no, nome, obrano, datafinal FROM bo WHERE nmdos LIKE '%preço%' AND datafinal = DATEADD(day, CASE DATEPART(weekday, GETDATE()) WHEN 2 THEN -3 -- 周一(对应数字2) ELSE -1 END, CONVERT(date, GETDATE()) );
这样修改后,周一的时候会自动回退3天取上周五的数据,其他日期正常取前一天的数据,也不会再出现转换错误了。
内容的提问来源于stack exchange,提问作者questionador
相关产品推荐
相关产品推荐

