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

DATEPART(weekday, GETDATE())对周六不生效?SQL Server进程问题排查

问题原因分析

你的问题出在SQL Server的DATEPART(weekday, ...)函数返回值依赖于**@@DATEFIRST**系统配置,这个参数决定了一周的起始星期几。

  • 默认情况下@@DATEFIRST为7(周日作为一周第一天),此时DATEPART(weekday, GETDATE())返回1代表周日、7代表周六,你的条件逻辑是成立的,但显然你的数据库环境里这个配置被修改了。
  • 比如如果你的@@DATEFIRST设为1(周一作为一周第一天),此时DATEPART(weekday, GETDATE())的返回值对应:周一=1、周二=2……周六=6、周日=7。你的条件<>1排除的是周一,<>7排除的是周日,而周六的返回值是6,不在排除范围内,所以进程会正常启动。
解决方案

你可以通过以下两种方式解决这个问题:

方式一:直接判断星期名称(不受配置影响)

使用DATENAME(weekday, GETDATE())直接获取星期的名称,完全避开对@@DATEFIRST的依赖:

WHERE DATENAME(weekday, GETDATE()) NOT IN ('Saturday', 'Sunday')
AND [other conditions]

注意:如果你的SQL Server是中文环境,需要把参数改成'星期六'和'星期日'

方式二:基于@@DATEFIRST做统一计算

通过偏移和取模运算,把星期值转换为统一基准(周一为0,周日为6),这样无论@@DATEFIRST是什么配置,都能准确排除周六和周日:

WHERE ((DATEPART(weekday, GETDATE()) + @@DATEFIRST - 1) % 7) NOT IN (0, 6)
AND [other conditions]

这里的逻辑是:通过计算将任意起始的星期值转换为以周一为起点的数值,其中0代表周六,6代表周日,排除这两个值即可。

验证当前配置

你可以先运行以下语句查看当前的@@DATEFIRST设置:

SELECT @@DATEFIRST;

内容的提问来源于stack exchange,提问作者Francesco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:24:58