当前位置:首页 > 问答 > 正文

SQL Server 日期函数:如何准确判断某天对应的星期几

📅 SQL Server | 日期函数:如何准确判断某天对应的星期几

🎯 场景引入

"小张,快帮我看看!" 同事小王急匆匆跑来,"客户要求每周五自动发送报表,但系统总在周四就发了,老板都快炸了💥!"

原来,小王用错了日期判断方法,在SQL Server中,准确判断星期几看似简单,但隐藏着不少坑🕳️,今天我们就来彻底解决这个问题!

SQL Server 日期函数:如何准确判断某天对应的星期几


📚 核心日期函数

SQL Server提供了几个强大的日期函数来处理星期几的判断:

DATEPART 函数(最常用)

-- 返回1-7,1=周日,2=周一...7=周六(默认美国周计数)
SELECT DATEPART(weekday, '2025-08-15') AS WeekdayNumber;
-- 配合CASE语句转换为星期名称
SELECT 
    CASE DATEPART(weekday, '2025-08-15')
        WHEN 1 THEN '星期日'
        WHEN 2 THEN '星期一'
        WHEN 3 THEN '星期二'
        WHEN 4 THEN '星期三'
        WHEN 5 THEN '星期四'
        WHEN 6 THEN '星期五'
        WHEN 7 THEN '星期六'
    END AS ChineseWeekday;

DATENAME 函数(直接返回英文名)

-- 返回英文星期名称(受语言设置影响)
SELECT DATENAME(weekday, '2025-08-15') AS EnglishWeekday; 
-- 可能返回'Friday'或'星期五',取决于服务器配置

FORMAT 函数(SQL Server 2012+)

-- 新版本推荐用法,直接格式化输出
SELECT FORMAT('2025-08-15', 'dddd') AS WeekdayName; -- 返回'Friday'
SELECT FORMAT('2025-08-15', 'ddd') AS ShortWeekday; -- 返回'Fri'

⚠️ 避坑指南

陷阱1:周起始日不同

-- 关键设置:查看当前周起始日
SELECT @@DATEFIRST AS CurrentFirstDayOfWeek; 
-- 默认美国标准(周日=1),中国习惯周一作为第一天
-- 临时修改周起始日(仅当前会话有效)
SET DATEFIRST 1; -- 将周一设为每周第一天

陷阱2:语言设置影响

-- 不同语言返回不同结果
SET LANGUAGE '简体中文';
SELECT DATENAME(weekday, '2025-08-15'); -- 返回'星期五'
SET LANGUAGE 'us_english';
SELECT DATENAME(weekday, '2025-08-15'); -- 返回'Friday'

终极解决方案(兼容所有环境)

-- 使用固定算法计算星期几(Zeller公式原理)
SELECT 
    ('日一二三四五六' + '') 
    SUBSTRING('日一二三四五六', 
              (DATEPART(weekday, DATEADD(day, @@DATEFIRST-1, '2025-08-15')) % 7 + 1, 
              1) AS Weekday;

🏆 最佳实践推荐

-- 方案1:统一设置环境后使用(推荐)
SET DATEFIRST 1; -- 确保周一是一周第一天
SET LANGUAGE '简体中文';
SELECT 
    DATEPART(weekday, '2025-08-15') AS WeekdayNum,
    DATENAME(weekday, '2025-08-15') AS WeekdayName;
-- 方案2:使用FORMAT函数(SQL Server 2012+)
SELECT FORMAT('2025-08-15', 'dddd') AS WeekdayName;
-- 方案3:创建自定义函数
CREATE FUNCTION dbo.GetChineseWeekday(@date DATE)
RETURNS NVARCHAR(3)
AS
BEGIN
    RETURN SUBSTRING('日一二三四五六', 
                   (DATEPART(weekday, @date) + @@DATEFIRST - 1) % 7 + 1, 1);
END;

🎉 真实案例解决

回到开头的故事,正确的解决方案应该是:

SQL Server 日期函数:如何准确判断某天对应的星期几

-- 确保周五触发(考虑周起始日设置)
IF DATEPART(weekday, GETDATE()) = 6 -- 假设已设置DATEFIRST 1(周一=1)
BEGIN
    EXEC sp_send_report; -- 执行发送报表的存储过程
END

📆 扩展知识

判断是否是工作日(周一至周五)

SELECT 
    CASE WHEN DATEPART(weekday, '2025-08-15') BETWEEN 2 AND 6 
         THEN '工作日' ELSE '周末' END AS DayType;

计算下周一的日期

SELECT DATEADD(day, (9 - DATEPART(weekday, GETDATE())) % 7, GETDATE()) AS NextMonday;

💡 小贴士:在SQL Server 2022最新版本中,新增了WEEKDAY()函数,用法更直观,建议升级后使用!

现在你已经成为SQL Server日期处理专家了!下次再遇到星期几的问题,就淡定地甩出这些代码吧~ 😎

SQL Server 日期函数:如何准确判断某天对应的星期几

发表评论