如何从日期范围中获取所有日期?
例如:01/01/2021至03/01/2021
需要一行结果:
col1 col2 col3
----------------------------------
01/01/2021 02/01/2021 03/01/2021
发布于 2021-05-14 16:29:22
需要一行结果:
您不能轻易做到这一点,因为Oracle (和SQL,通常)需要一组固定的已知列才能执行查询。
如果您想以行的形式生成值,那么这很容易,您可以使用分层查询:
SELECT DATE '2021-01-01' + LEVEL - 1 AS value
FROM DUAL
CONNECT BY DATE '2021-01-01' + LEVEL - 1 <= DATE '2021-01-03';
或递归子查询因式分解子句:
WITH date_ranges ( start_date, end_date ) AS (
SELECT DATE '2021-01-01', DATE '2021-01-03' FROM DUAL
UNION ALL
SELECT start_date + 1, end_date FROM date_ranges WHERE start_date + 1 <= end_date
)
SELECT start_date AS value
FROM date_ranges
对于将值生成为列的问题,理想的解决方案是在用于访问数据库的任何第三方应用程序(PHP、C#、Java、Python等)中将行转置为列。如果你有一个动态的列数,do NOT尝试在SQL中透视它。
现在,如果你有一组固定的列,那么这是可能的。例如,如果您总是有3个日期:
WITH date_range ( start_date ) AS (
SELECT DATE '2021-01-01' FROM DUAL
)
SELECT start_date AS col1,
start_date + 1 AS col2,
start_date + 2 AS col3
FROM date_range;
如果您想尝试旋转到动态数量的列,那么您需要一个dynamic pivot,并且需要在链接答案中使用其中一个解决方案(但不是这样做,而是在第三方应用程序中执行)。
db<>fiddle
https://stackoverflow.com/questions/67530797
复制相似问题