mysql时间段拆分_等一个用MYSQL的大佬,跨年时间段按年份拆分为多行,在线求助...

ORACLE中几分钟写出来的SQL,需要用MYSQL实现,结果卡住了,主要是不知道MYSQL怎么解决时间的拆分,两段时间如果跨年,中间以一年的12月31号拆分成多行。

下面是我在ORACLE中写的SQL,可直接运行,

求助大神,用MYSQL要怎样实现:

SELECT L.EMP_NAME,

TO_CHAR(L.LEAVE_END_DATE, 'yyyy') - ROWNUM + 1 YEAR,

CASE

WHEN TO_CHAR(L.LEAVE_END_DATE, 'yyyy') - ROWNUM + 1 =

TO_CHAR(L.LEAVE_START_DATE, 'yyyy') THEN

TO_CHAR(LEAVE_START_DATE, 'yyyy-mm-dd hh24:mi')

ELSE

TO_CHAR(L.LEAVE_END_DATE, 'yyyy') - ROWNUM + 1 || '-01-01 00:00'

END LEAVE_START_DATE,

CASE

WHEN TO_CHAR(L.LEAVE_END_DATE, 'yyyy') - ROWNUM + 1 =

TO_CHAR(L.LEAVE_END_DATE, 'yyyy') THEN

TO_CHAR(LEAVE_END_DATE, 'yyyy-mm-dd hh24:mi')

ELSE

TO_CHAR(L.LEAVE_END_DATE, 'yyyy') - ROWNUM + 1 || '-12-31 23:59'

END LEAVE_END_DATE,

L.PROCESSCODE || '_' || ROWNUM PROCESSCODE

FROM DUAL

LEFT JOIN (SELECT '测试' EMP_NAME, '2016' YEAR,

TO_DATE('2017-02-13 8:30', 'yyyy-mm-dd hh24:mi') LEAVE_START_DATE,

TO_DATE('2019-05-22 8:30', 'yyyy-mm-dd hh24:mi') LEAVE_END_DATE,

'AAA' PROCESSCODE

FROM DUAL) L

ON 1 = 1

CONNECT BY ROWNUM <= TO_CHAR(L.LEAVE_END_DATE, 'yyyy') -

TO_CHAR(L.LEAVE_START_DATE, 'yyyy') + 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想将 MySQL 中的时间区间按照年拆分多行数据,可以使用 `UNION ALL` 和 `DATE_ADD` 函数来实现。 以下是一种可能的解决方案: ``` SELECT * FROM ( SELECT DATE_ADD('2000-01-01', INTERVAL n YEAR) AS year_start, DATE_ADD('2000-12-31', INTERVAL n YEAR) AS year_end FROM (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS years ) AS year_ranges WHERE year_ranges.year_start <= '2021-12-31' AND year_ranges.year_end >= '2021-01-01' ``` 以上语句将返回一个包含多行数据的结果集,每行数据代表一个时间区间(按年拆分),并且这些时间区间和指定的日期范围有重叠部分。 具体地,以上语句使用了一个子查询来生成多个年份(0 到 4),然后将每个年份转换为对应的时间区间(例如,2000 年的时间区间是 `'2000-01-01'` 到 `'2000-12-31'`),最后筛选出和指定日期范围有重叠部分的时间区间。 如果你需要获取每个时间区间的数据,可以将以上语句作为子查询,并在外层查询中使用 `JOIN` 或 `WHERE` 子句来筛选出符合条件的数据。例如: ``` SELECT * FROM my_table WHERE date_column BETWEEN ( SELECT year_ranges.year_start FROM ( SELECT DATE_ADD('2000-01-01', INTERVAL n YEAR) AS year_start, DATE_ADD('2000-12-31', INTERVAL n YEAR) AS year_end FROM (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS years ) AS year_ranges WHERE year_ranges.year_start <= '2021-12-31' AND year_ranges.year_end >= '2021-01-01' ) AND ( SELECT year_ranges.year_end FROM ( SELECT DATE_ADD('2000-01-01', INTERVAL n YEAR) AS year_start, DATE_ADD('2000-12-31', INTERVAL n YEAR) AS year_end FROM (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) AS years ) AS year_ranges WHERE year_ranges.year_start <= '2021-12-31' AND year_ranges.year_end >= '2021-01-01' ) ``` 以上语句将返回符合指定日期范围的 `my_table` 表中的数据,其中日期字段 `date_column` 的值在指定时间区间内。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值