如何编写SQL语句计算指定日期后的下一个周五?示例:01-March-2018
如何找到特定日期之后的下一个周五
嘿,这个需求其实挺普遍的,不同SQL数据库的函数语法略有差异,我给你分几种常用的场景来讲解,就用你给的示例日期01-March-2018(也就是2018-03-01,这天是周四)来演示:
MySQL/MariaDB
这里我们可以用DATE_ADD结合WEEKDAY函数来实现。WEEKDAY返回的数值是:周一=0,周二=1...周五=4,周六=5,周日=6。核心思路是计算当前日期到下一个周五的天数差,用取模处理当天已经是周五的情况(此时要返回7天后的周五):
SELECT DATE_ADD('2018-03-01', INTERVAL (4 - WEEKDAY('2018-03-01') + 7) % 7 DAY) AS next_friday;
执行后会得到2018-03-02,也就是目标下周五。
PostgreSQL
PostgreSQL里可以用EXTRACT(DOW FROM date)获取星期几(周日=0,周一=1...周五=5,周六=6)。同样通过计算天数差来得到结果,写法可以更简洁:
SELECT '2018-03-01'::DATE + (5 - EXTRACT(DOW FROM '2018-03-01'::DATE) + 7) % 7 * INTERVAL '1 day' AS next_friday;
或者用CASE语句更直观:
SELECT CASE WHEN EXTRACT(DOW FROM '2018-03-01'::DATE) = 5 THEN '2018-03-01'::DATE + INTERVAL '7 days' ELSE '2018-03-01'::DATE + INTERVAL ((5 - EXTRACT(DOW FROM '2018-03-01'::DATE)) % 7) || ' days' END AS next_friday;
SQL Server
SQL Server里要注意DATEPART(dw)的结果会受DATEFIRST设置影响(默认可能是周日为一周第一天),所以最好先设置周一为第一天避免歧义:
SET DATEFIRST 1; -- 设定周一为一周的第一天,此时周五=5 SELECT DATEADD(DAY, (5 - DATEPART(dw, '2018-03-01') + 7) % 7, '2018-03-01') AS next_friday;
如果不想修改全局设置,也可以基于默认的周日为第一天(周五=6)来调整公式:
SELECT DATEADD(DAY, (6 - DATEPART(dw, '2018-03-01') + 7) % 7, '2018-03-01') AS next_friday;
Oracle
Oracle提供了非常方便的NEXT_DAY函数,直接就能获取指定日期之后的下一个指定星期几的日期。注意第二个参数可以用数字(周日=1,周一=2...周五=6)或者对应的星期名称(取决于NLS语言设置):
用数字的写法(不受语言影响更稳妥):
SELECT NEXT_DAY(TO_DATE('01-March-2018', 'DD-Month-YYYY'), 6) AS next_friday FROM DUAL;
如果你的数据库是英文环境,也可以直接写星期名称:
SELECT NEXT_DAY(TO_DATE('01-March-2018', 'DD-Month-YYYY'), 'FRIDAY') AS next_friday FROM DUAL;
核心思路总结
不管哪种数据库,核心逻辑都是:
- 确定当前日期是星期几
- 计算到下一个周五需要添加的天数(如果当天已经是周五,就加7天获取下一周的周五)
- 把天数加到原日期上得到结果
内容的提问来源于stack exchange,提问作者eimear1316
相关产品推荐
相关产品推荐

