如何基于Quarter Dates表和当前日期精准查询对应季度开始日期?
如何根据当前日期从给定表中查询对应季度的开始日期?
我有如下表格:
| Quarter Start |
|---|
| 30/12/2016 |
| 31/03/2017 |
| 30/06/2017 |
| 29/09/2017 |
| 29/12/2017 |
| 30/03/2018 |
| 29/06/2018 |
| 28/09/2018 |
| 28/12/2018 |
| 29/03/2019 |
| 28/06/2019 |
| 27/09/2019 |
| 27/12/2019 |
| 27/03/2020 |
| 26/06/2020 |
| 25/09/2020 |
| 01/01/2021 |
| 02/04/2021 |
| 02/07/2021 |
| 01/10/2021 |
| 31/12/2021 |
| 01/04/2022 |
| 01/07/2022 |
| 30/09/2022 |
| 30/12/2022 |
| 24/03/2023 |
| 30/06/2023 |
| 29/09/2023 |
| 29/12/2023 |
| 29/03/2024 |
| 28/06/2024 |
| 27/09/2024 |
| 03/01/2025 |
| 04/04/2025 |
| 03/10/2025 |
| 02/01/2026 |
| 03/04/2026 |
| 03/07/2026 |
| 02/10/2026 |
| 01/01/2027 |
| 02/04/2027 |
| 02/07/2027 |
| 01/10/2027 |
我需要编写SQL语句,始终根据此表和当前日期查询出对应的当前季度开始日期。例如当前季度对应'09/12/2022'(注:表中对应日期为30/12/2022,可能为笔误),如何确保总能选中该日期?
非常感谢!
更新:尝试过的语句无效
我尝试了以下语句:
SELECT quarter_start, EXTRACT (QUARTER FROM quarter_start) FROM odwh_work.sdc_2027 WHERE EXTRACT (QUARTER FROM quarter_start) = EXTRACT (QUARTER FROM current_date) ORDER BY 1 DESC
但仍未返回目标日期。
解决方案
你的原SQL存在两个核心问题:
- 仅匹配季度数,未限制年份,会返回所有年份中同季度的记录,无法定位到当前年份的季度
- 如果
quarter_start存储的是字符串类型(而非日期类型),EXTRACT函数无法正确解析日期,导致逻辑错误
针对这些问题,提供两种可行的SQL写法:
方法1:匹配当前年份和季度
先将字符串格式的日期转换为数据库可识别的日期类型,再同时匹配年份和季度:
SELECT quarter_start FROM odwh_work.sdc_2027 WHERE -- 转换日期格式(DD/MM/YYYY)并匹配年份 EXTRACT(YEAR FROM TO_DATE(quarter_start, 'DD/MM/YYYY')) = EXTRACT(YEAR FROM CURRENT_DATE) -- 匹配当前季度 AND EXTRACT(QUARTER FROM TO_DATE(quarter_start, 'DD/MM/YYYY')) = EXTRACT(QUARTER FROM CURRENT_DATE);
方法2:自动匹配当前日期所在的最近季度开始日期
无需手动匹配年份和季度,直接找到小于等于当前日期的最大季度开始日期,适配所有场景:
SELECT MAX(quarter_start) AS current_quarter_start FROM odwh_work.sdc_2027 WHERE TO_DATE(quarter_start, 'DD/MM/YYYY') <= CURRENT_DATE;
说明
- 如果你的
quarter_start字段本身就是日期类型,可以去掉TO_DATE(quarter_start, 'DD/MM/YYYY'),直接使用quarter_start即可 - 方法2更通用,即使当前日期处于季度中间,也能准确返回对应的季度开始日期
内容的提问来源于stack exchange,提问作者shazma
相关产品推荐
相关产品推荐

