如何编写自动适配发布日期的SQL查询,避免硬编码日期?
动态日期SQL查询方案
核心思路
不用硬编码日期,直接利用数据库内置日期函数,根据当前发布日期自动计算数据时间范围:
- 首次发布:取当前日期往前推10年的所有数据
- 后续定期发布:结合附图常见的年度周期要求(取截止到上一自然年度末的近10年数据),自动计算区间边界
分数据库实现示例
MySQL/MariaDB
首次发布查询(近10年数据)
SELECT * FROM your_table WHERE publish_date >= DATE_SUB(CURDATE(), INTERVAL 10 YEAR);
后续年度发布查询
-- 计算上一年度最后一天 SET @last_year_end = DATE_FORMAT(CURDATE(), '%Y-01-01') - INTERVAL 1 DAY; -- 计算10年前的起始日期 SET @start_date = DATE_SUB(@last_year_end, INTERVAL 10 YEAR); SELECT * FROM your_table WHERE publish_date BETWEEN @start_date AND @last_year_end;
SQL Server
首次发布查询
SELECT * FROM your_table WHERE publish_date >= DATEADD(YEAR, -10, GETDATE());
后续年度发布查询
DECLARE @last_year_end DATE = DATEFROMPARTS(YEAR(GETDATE())-1, 12, 31); DECLARE @start_date DATE = DATEADD(YEAR, -10, @last_year_end); SELECT * FROM your_table WHERE publish_date BETWEEN @start_date AND @last_year_end;
PostgreSQL
首次发布查询
SELECT * FROM your_table WHERE publish_date >= CURRENT_DATE - INTERVAL '10 years';
后续年度发布查询
WITH date_params AS ( SELECT (DATE_TRUNC('year', CURRENT_DATE) - INTERVAL '1 day') AS last_year_end, (DATE_TRUNC('year', CURRENT_DATE) - INTERVAL '10 years 1 day') AS start_date ) SELECT t.* FROM your_table t CROSS JOIN date_params dp WHERE t.publish_date BETWEEN dp.start_date AND dp.last_year_end;
适配其他发布周期
如果附图要求季度/半年发布,只需调整日期计算逻辑:
- 季度发布:取上一季度末往前推10年
- 半年发布:取上半年度末往前推10年
以MySQL季度发布为例:
SET @last_quarter_end = LAST_DAY(DATE_SUB(CURDATE(), INTERVAL QUARTER(CURDATE()) QUARTER)); SET @start_date = DATE_SUB(@last_quarter_end, INTERVAL 10 YEAR); SELECT * FROM your_table WHERE publish_date BETWEEN @start_date AND @last_quarter_end;
内容的提问来源于stack exchange,提问作者sai royal
相关产品推荐
相关产品推荐

