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

SQL Server 日期函数:如何判断某一天是星期几并进行计算

SQL Server | 日期函数:如何判断某一天是星期几并进行计算

场景引入

"小王最近接到一个需求:公司需要统计每周五的订单量,但数据库里只有下单日期,他盯着屏幕上的日期数据发愁——'2025-08-15'到底是星期几?难道要手动查日历吗?"

别急!SQL Server 提供了一套强大的日期函数,能轻松解决这类问题,下面我们就来详细讲解如何用 SQL Server 判断任意日期是星期几,并基于此进行日期计算。

SQL Server 日期函数:如何判断某一天是星期几并进行计算


核心函数:DATEPART 和 DATENAME

DATEPART 函数

DATEPART 返回日期的指定部分(如年、月、日、星期等)的数值,判断星期几的语法:

SELECT DATEPART(weekday, '2025-08-15') AS WeekdayNumber;

返回值说明

  • 默认情况下,1=星期日,2=星期一,...,7=星期六
  • 受系统设置 SET DATEFIRST 影响(后文会说明调整方法)

DATENAME 函数

DATENAME 返回日期部分的名称(英文):

SELECT DATENAME(weekday, '2025-08-15') AS WeekdayName;
-- 输出:Friday  

处理中文星期显示

如果需要显示中文星期(如"星期五"),可通过 CASE 语句实现:

SQL Server 日期函数:如何判断某一天是星期几并进行计算

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;

控制周起始日(DATEFIRST)

SQL Server 默认将周日视为一周的第一天(DATEPART 返回1),如果需要改为周一为首日,使用:

SET DATEFIRST 1; -- 1=星期一,7=星期日
SELECT DATEPART(weekday, '2025-08-15'); -- 此时周五会返回5  

实际应用案例

案例1:查询某周的所有订单

-- 查询2025年第32周(8月4日-8月10日)的订单
SELECT *
FROM Orders
WHERE DATEPART(week, OrderDate) = 32
AND YEAR(OrderDate) = 2025;

案例2:计算下一个周五的日期

DECLARE @Today DATE = GETDATE();
SELECT 
    DATEADD(day, 
            (CASE WHEN DATEPART(weekday, @Today) <= 6 
                  THEN 6 - DATEPART(weekday, @Today)
                  ELSE 6 + (7 - DATEPART(weekday, @Today))
             END),
            @Today) AS NextFriday;

案例3:统计每周五的订单量

SELECT 
    DATEPART(week, OrderDate) AS WeekNumber,
    COUNT(*) AS FridayOrders
FROM Orders
WHERE DATEPART(weekday, OrderDate) = 6 -- 假设DATEFIRST=7(周日为1)
GROUP BY DATEPART(week, OrderDate);

注意事项

  1. 时区问题:日期计算基于服务器时区设置
  2. 性能优化:对大量数据使用 DATEPART 时,考虑建立计算列索引
  3. 边界情况:跨年周的判断需结合 ISO_WEEKDATEPART(iso_week, date)


通过 DATEPARTDATENAMEDATEFIRST 的组合,SQL Server 可以灵活处理星期相关的所有需求,下次遇到"这天是星期几"的问题时,不妨直接让数据库告诉你答案!

(本文基于 SQL Server 2022 版本验证,日期规则参考 2025-08 时区标准)

发表评论