gpt4 book ai didi

sql - 如何在两个给定日期之间将一行拆分为多行?

转载 作者:行者123 更新时间:2023-12-01 10:36:59 24 4
gpt4 key购买 nike

如何用

分割一行
Start Date : 02-OCT-2015
End Date : 31-DEC-2015

在 Oracle 中进入下面的行?

02-OCT-2015 31-OCT-2015
01-NOV-2015 30-NOV-2015
01-DEC-2015 31-DEC-2015

最佳答案

您需要的DATE 算法 可以使用以下方法完成:

  • ADD_MONTHS
  • LAST_DAY
  • 截断
  • CONNECT BY 即典型的行生成器
  • CASE表达式

假设您有两个日期作为开始结束 日期,以下查询将根据 将日期分成多行 strong>几个月。

SQL> WITH sample_data AS
2 (SELECT DATE '2015-10-02' Start_Date, DATE '2015-12-25' End_Date FROM DUAL)
3 -- end of sample_date to mock an actual table
4 SELECT CASE
5 WHEN start_date >= TRUNC(add_months(start_date,COLUMN_VALUE - 1),'MM')
6 THEN
7 TO_CHAR(start_date, 'YYYY-MM-DD')
8 ELSE
9 TO_CHAR(TRUNC(add_months(start_date,COLUMN_VALUE - 1),'MM'),'YYYY-MM-DD')
10 END new_start_date,
11 CASE
12 WHEN end_date <= last_day(TRUNC(add_months(start_date,COLUMN_VALUE - 1),'MM'))
13 THEN
14 TO_CHAR(end_date, 'YYYY-MM-DD')
15 ELSE
16 TO_CHAR(last_day(TRUNC(add_months(start_date,COLUMN_VALUE - 1),'MM')),
17 'YYYY-MM-DD')
18 END new_end_date
19 FROM sample_data,
20 TABLE(
21 CAST(
22 MULTISET
23 (SELECT LEVEL
24 FROM dual
25 CONNECT BY add_months(TRUNC(start_date,'MM'),LEVEL - 1) <= end_date
26 ) AS sys.OdciNumberList
27 )
28 )
29 ORDER BY column_value;

NEW_START_DATE NEW_END_DATE
-------------- ------------
2015-10-02 2015-10-31
2015-11-01 2015-11-30
2015-12-01 2015-12-25

查询的工作原理:

如果您应该了解如何使用 CONNECT BY 子句 生成行,剩下的就是简单的 DATE 算法。

  • TRUNC(date, 'MM') 给出月份的第一天,在您的情况下成为开始日期。

  • ADD_MONTHS(date, value) 向日期添加在 value 中指定的月份。

  • LAST_DAY 给出该月的最后一天,在您的情况下成为结束日期。

关于sql - 如何在两个给定日期之间将一行拆分为多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33626252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com