编写SQL查询:基于Employee_info表生成大于SYSDATE的递增日期
生成逐年累加日期序列的SQL查询方案
针对需求:从Employee_info表的每个员工原始日期开始,每次累加365天生成日期,直到日期超过当前系统日期,最终输出员工ID(id)和对应的序列日期(future_date),以下是主流数据库的实现代码:
Oracle 实现
Oracle支持递归CTE来生成连续日期序列,结合SYSDATE获取当前系统日期:
WITH date_series AS ( -- 初始查询:获取每个员工的原始日期并转换为日期类型 SELECT employee_id AS id, TO_DATE(date, 'DD-MM-YYYY') AS future_date FROM Employee_info UNION ALL -- 递归部分:逐年累加365天,直到超过当前日期停止 SELECT id, future_date + 365 FROM date_series WHERE future_date + 365 <= SYSDATE ) -- 输出结果并按员工ID、日期排序 SELECT id, future_date FROM date_series ORDER BY id, future_date;
关键说明
TO_DATE(date, 'DD-MM-YYYY'):将表中存储的DD-MM-YYYY格式字符串转换为Oracle日期类型,确保日期运算有效。- 递归终止条件:当累加365天后的日期超过
SYSDATE时,停止递归,避免生成无效日期。
MySQL 实现(8.0+版本)
MySQL 8.0及以上支持递归CTE,使用CURDATE()获取当前日期:
WITH RECURSIVE date_series AS ( SELECT employee_id AS id, STR_TO_DATE(`date`, '%d-%m-%Y') AS future_date FROM Employee_info UNION ALL SELECT id, DATE_ADD(future_date, INTERVAL 365 DAY) FROM date_series WHERE DATE_ADD(future_date, INTERVAL 365 DAY) <= CURDATE() ) SELECT id, future_date FROM date_series ORDER BY id, future_date;
关键说明
STR_TO_DATE(date, '%d-%m-%Y'):匹配表中日-月-年格式的字符串,转换为MySQL日期类型。DATE_ADD函数用于实现日期累加操作,终止条件对比CURDATE()。
PostgreSQL 实现
PostgreSQL通过递归CTE和日期区间运算实现:
WITH RECURSIVE date_series AS ( SELECT employee_id AS id, TO_DATE(date, 'DD-MM-YYYY') AS future_date FROM Employee_info UNION ALL SELECT id, future_date + INTERVAL '365 days' FROM date_series WHERE future_date + INTERVAL '365 days' <= CURRENT_DATE ) -- 将interval类型转换为date类型输出 SELECT id, future_date::DATE FROM date_series ORDER BY id, future_date;
关键说明
- 使用
+ INTERVAL '365 days'完成日期累加,终止条件对比CURRENT_DATE。 - 最终将结果转换为DATE类型,保证输出格式符合需求。
内容的提问来源于stack exchange,提问作者Logan
相关产品推荐
相关产品推荐

