巧妙利用日历图计算当前日期属于本月第几周
1 先看答案
SELECT CEILING((DAY(NOW())+WEEKDAY(NOW()-INTERVAL DAY(NOW())-1 DAY)) / 7 )
涉及到的 MySQL 函数/关键字
函数/关键字 | 用途 |
---|---|
NOW() | 获取当前时间 |
CEILING() | 向上取整 |
DAY(date) | 计算 date 是本月的第几天 |
WEEKDAY(date) | 计算 date 是本周周几,0 表示周一 |
INTERVAL | 关键字,计算时间间隔 |
2 解析
2.1 总体思想
参考以下日历图,在图中可以看到,4 月 20 日是 4 月的第四周。方法是从上往下数第四行。按照这个思想,我们只需要知道 3 月 27 日到 4 月 20 日一共有几天,然后除以 7 向上取整即可。也就是 CEILING((20+5)/7)。
2.2 步骤分解
-- 获取当前时间,假设返回结果为 2023-04-20 12:00:00
SELECT NOW();
-- 本月第几天,结果为 20
SELECT DAY(NOW());
-- 本月第一天的日期,结果为 2023-04-01 12:00:00
SELECT NOW() - INTERVAL DAY(NOW()) -1 DAY;
-- 本月第一天是周几,结果为 5
SELECT WEEKDAY(NOW() - INTERVAL DAY(NOW()) -1 DAY);
-- 当前天数加上补齐日期矩阵需要的上月占用的天数,结果为 25
SELECT (DAY(NOW()) + WEEKDAY(NOW() - INTERVAL DAY(NOW()) -1 DAY));
-- 除以每周的天数 7,并向上取整,最终结果为 4
SELECT CEILING((DAY(NOW()) + WEEKDAY(NOW() - INTERVAL DAY(NOW()) -1 DAY))/ 7 );