Oracle SQL拆分周日期[重复]

vyswwuz2  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(82)

此问题已在此处有答案

List all days between two dates in Oracle(2个答案)
How do I generate rows of dates given a date and interval using Oracle SQL query?(2个答案)
18天前关闭
我是SQL世界的新手,我不太擅长日期。我需要帮助查询。我不知道如何把一周的日期分成几天。
像这样的table。
| ID|星历|数量|
| --|--|--|
| 1 |2019 - 09 - 24| 745 |
| 2 |2019 - 09 - 24| 353 |
| 3 |2023年10月1日| 442 |
我想要的是把一周分成几天,例如像这样。
| ID|星历|date_days|天|数量|
| --|--|--|--|--|
| 1 |2019 - 09 - 24| 2019 - 09 - 24|周日| 745 |
| 1 |2019 - 09 - 24| 2019 - 09 - 25|周一| 745 |
| 1 |2019 - 09 - 24| 2019 - 09 - 26|周二| 745 |
| 1 |2019 - 09 - 24| 2019 - 09 - 27|周三| 745 |
| 1 |2019 - 09 - 24| 2019 - 09 - 21 10:00:00|周四| 745 |
| 1 |2019 - 09 - 24| 2019 - 09 - 21 10:00:00|周五| 745 |
| 1 |2019 - 09 - 24| 2019 - 09 - 21 00:00:00|周六| 745 |
| 2 |2019 - 09 - 24| 2019 - 09 - 24|周日| 353 |
| 2 |2019 - 09 - 24| 2019 - 09 - 25|周一| 353 |
| 2 |2019 - 09 - 24| 2019 - 09 - 26|周二| 353 |
| 2 |2019 - 09 - 24| 2019 - 09 - 27|周三| 353 |
| 2 |2019 - 09 - 24| 2019 - 09 - 21 10:00:00|周四| 353 |
| 2 |2019 - 09 - 24| 2019 - 09 - 21 10:00:00|周五| 353 |
| 2 |2019 - 09 - 24| 2019 - 09 - 21 00:00:00|周六| 353 |
| 3 |2023年10月1日|2023年10月1日|周日| 442 |
| 3 |2023年10月1日|2023年10月2日|周一| 442 |
| 3 |2023年10月1日|2023年10月3日|周二| 442 |
| 3 |2023年10月1日|2023年10月4日|周三| 442 |
| 3 |2023年10月1日|2023年10月5日|周四| 442 |
| 3 |2023年10月1日|2023年10月6日|周五| 442 |
| 3 |2023年10月1日|2023年7月10日|周六| 442 |

rjee0c15

rjee0c151#

这是一个 row generator 的问题。这里有一个选择:
样本数据:

SQL> select * from your_table_name;

        ID STARTDATE         QTY
---------- ---------- ----------
         1 24/09/2023        745
         3 01/10/2023        442

查询;请注意,您不应避免使用distinct关键字进行重复。它在小数据集上工作正常,但随着your_table_name中行数的增加,查询的效果越来越差。接下来的一个应该表现得更好。

SQL> select id,
  2         startdate,
  3         startdate + column_value - 1 as date_days,
  4         to_char(startdate + column_value - 1, 'Day', 'nls_date_language = english') days,
  5         qty
  6  from your_table_name cross join
  7    table(cast(multiset(select level from dual
  8                        connect by level <= 7
  9                       ) as sys.odcinumberlist))
 10  order by id, date_days
 11  /

        ID STARTDATE  DATE_DAYS  DAYS                   QTY
---------- ---------- ---------- --------------- ----------
         1 24/09/2023 24/09/2023 Sunday                 745
         1 24/09/2023 25/09/2023 Monday                 745
         1 24/09/2023 26/09/2023 Tuesday                745
         1 24/09/2023 27/09/2023 Wednesday              745
         1 24/09/2023 28/09/2023 Thursday               745
         1 24/09/2023 29/09/2023 Friday                 745
         1 24/09/2023 30/09/2023 Saturday               745
         3 01/10/2023 01/10/2023 Sunday                 442
         3 01/10/2023 02/10/2023 Monday                 442
         3 01/10/2023 03/10/2023 Tuesday                442
         3 01/10/2023 04/10/2023 Wednesday              442
         3 01/10/2023 05/10/2023 Thursday               442
         3 01/10/2023 06/10/2023 Friday                 442
         3 01/10/2023 07/10/2023 Saturday               442

14 rows selected.

SQL>
o4tp2gmn

o4tp2gmn2#

想解决这个问题,结果发现了这个。

WITH date_series AS (
SELECT
    ID,
    StartDate,
    StartDate + LEVEL - 1 AS date_days
FROM
    your_table_name
CONNECT BY
    LEVEL <= 7
)
SELECT distinct
t.ID,
t.StartDate,
ds.date_days,
TO_CHAR(ds.date_days, 'Day') AS Days,
t.QTY
FROM
your_table_name t
JOIN
date_series ds
ON
t.ID = ds.ID
order by id, startdate, date_days;

http://sqlfiddle.com/#!4/4c28bc/9

相关问题