如何在MySQL中获得非标准季度的第一个日期



我正在尝试使用MySQL获取非标准季度的开始/结束日期。这个问题/答案非常适用于获取标准季度的开始/结束日期(1月至3月、4月至6月等(。

如果季度不是在典型的财政年度季度(1月至3月、4月至6月等(开始,有什么关于如何修改查询的建议吗?我有一个案例,我需要在2月(2月-4月、5月-7月等(和3月(3月-5月、6月-8月等(开始本季度。

我曾尝试调整间隔,以适应月份1或2的变化,但由于MySQL使用标准的一年季度为QUARTER((返回一组1,2,3,4,因此无法正常工作。

以下是之前链接的问题中的查询,返回标准日历年季度的开始/结束(输入我感兴趣的季度开始/结束日期(:

SELECT MAKEDATE(YEAR('2022-11-02'), 1) + INTERVAL QUARTER('2022-11-02') QUARTER - INTERVAL 1 QUARTER AS quarter_start;
+---------------+
| quarter_start |
+---------------+
| 2022-10-01    |
+---------------+
SELECT MAKEDATE(YEAR('2022-11-02'), 1) + INTERVAL QUARTER('2022-11-02') QUARTER - INTERVAL 1 DAY AS quarter_end;
+---------------+
| quarter_end   |
+---------------+
| 2022-12-31    |
+---------------+

如果该季度应提前1个月(季度:2月至4月、5月至7月、8月至10月、11月至1月(,我如何调整它以返回2022-11-01的季度开始和2023-01-31的季度结束?

您必须根据月份自己计算。

SELECT CASE 
WHEN MONTH(date) = 1 THEN FORMAT_DATE(DATE_SUB(date, INTERVAL 1 YEAR), '%Y-11-01'))
WHEN MONTH(date) IN (2, 3, 4) THEN FORMAT_DATE(date, '%Y-02-01'))
WHEN MONTH(date) IN (5, 6, 7) THEN FORMAT_DATE(date, '%Y-05-01'))
WHEN MONTH(date) IN (8, 9, 10) THEN FORMAT_DATE(date, '%Y-08-01'))
ELSE FORMAT_DATE(date, '%Y-11-01'))
END AS quarter_start,
CASE 
WHEN MONTH(date) = 1 THEN FORMAT_DATE(date, '%Y-01-31'))
WHEN MONTH(date) IN (2, 3, 4) THEN FORMAT_DATE(date, '%Y-04-30'))
WHEN MONTH(date) IN (5, 6, 7) THEN FORMAT_DATE(date, '%Y-07-31'))
WHEN MONTH(date) IN (8, 9, 10) THEN FORMAT_DATE(date, '%Y-10-31'))
ELSE FORMAT_DATE(DATE_ADD(date, INTERVAL 1 YEAR), '%Y-01-31'))
END AS quarter_end

这是一个简单的日期数学。

select
date,
date - interval day(date)-1 day - interval (month(date) + offset) mod 3 month as quarter_start,
date - interval day(date)-1 day - interval (month(date) + offset) mod 3 - 3 month - interval 1 day as quarter_end

其中,日历季度的偏移量为2,2月/5月/8月/11月开始的季度为1,3月/6月/9月/12月开始的月份为0。

最新更新