You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:47:38