暂无图片
请教一个SQL(Oralce数据库)
我来答
分享
刘晓华
2024-04-29
请教一个SQL(Oralce数据库)
暂无图片 50M

给定一个员工的入职日期,生成时段序列,例如某员工的入职日期是2018.04.03, 生成时段

2018.04.03   2019.04.02

2019.04.03   2020.04.02

2020.04.03   2021.04.02

2021.04.03   2022.04.02

2022.04.03   2023.04.02

2023.04.03   2024.04.02

2024.04.03   2025.04.02 (截止日期大于当前日期即可,例如今天是2024.04.29) 

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
豆宇斯

WITH entry_date AS (
SELECT TO_DATE('2018-04-03', 'YYYY-MM-DD') AS start_date FROM dual
)
SELECT
ADD_MONTHS(start_date, (LEVEL - 1) * 12) AS period_start,
ADD_MONTHS(start_date, LEVEL * 12) - 1 AS period_end
FROM
entry_date
CONNECT BY
ADD_MONTHS(start_date, (LEVEL - 1) * 12) <= CURRENT_DATE;

暂无图片 评论
暂无图片 有用 2
暂无图片
豆宇斯

WITH entry_date AS (
SELECT DATE '2018-04-03' AS start_date FROM dual
)
SELECT
start_date + (LEVEL - 1) * INTERVAL '1' YEAR AS period_start,
LEAST(start_date + LEVEL * INTERVAL '1' YEAR - INTERVAL '1' DAY, CURRENT_DATE) AS period_end
FROM
entry_date
CONNECT BY
start_date + (LEVEL - 1) * INTERVAL '1' YEAR <= CURRENT_DATE;
这样子?

暂无图片 评论
暂无图片 有用 1
豆宇斯
答主
2024-04-29
最后一个日期不对
浅默

首先,我们需要计算员工的入职日期和当前日期之间的年份差。然后,根据年份差生成时段序列。

以下是SQL查询:

WITH years_diff AS (
SELECT TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('2018-04-03', 'YYYY-MM-DD')) / 12) + 1 AS years
FROM DUAL
),
date_series AS (
SELECT LEVEL - 1 AS year_diff,
TO_DATE('2018-04-03', 'YYYY-MM-DD') + INTERVAL '1' YEAR * (LEVEL - 1) AS start_date,
TO_DATE('2018-04-03', 'YYYY-MM-DD') + INTERVAL '1' YEAR * LEVEL - INTERVAL '1' DAY AS end_date
FROM DUAL
CONNECT BY LEVEL <= (SELECT years FROM years_diff)
)
SELECT start_date, end_date
FROM date_series;



这个查询首先计算员工入职日期和当前日期之间的年份差(years_diff),然后使用CONNECT BY子句生成时段序列(date_series)。最后,从date_series中选择start_date和end_date。 

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏