首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在一行中获取日期范围中的所有日期- oracle sql

如何在一行中获取日期范围中的所有日期- oracle sql
EN

Stack Overflow用户
提问于 2021-05-14 15:48:50
回答 1查看 41关注 0票数 2

如何从日期范围中获取所有日期?

例如:01/01/2021至03/01/2021

需要一行结果:

代码语言:javascript
代码运行次数:0
运行
复制
col1        col2        col3
----------------------------------
01/01/2021  02/01/2021  03/01/2021
EN

回答 1

Stack Overflow用户

发布于 2021-05-14 16:29:22

需要一行结果:

您不能轻易做到这一点,因为Oracle (和SQL,通常)需要一组固定的已知列才能执行查询。

如果您想以行的形式生成值,那么这很容易,您可以使用分层查询:

代码语言:javascript
代码运行次数:0
运行
复制
SELECT DATE '2021-01-01' + LEVEL - 1 AS value
FROM   DUAL
CONNECT BY DATE '2021-01-01' + LEVEL - 1 <= DATE '2021-01-03';

或递归子查询因式分解子句:

代码语言:javascript
代码运行次数:0
运行
复制
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个日期:

代码语言:javascript
代码运行次数:0
运行
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67530797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档