繁体   English   中英

如何在水平行中显示某个日期范围内的所有日期?

[英]How to show all dates from a certain date range in horizontal row?

我在 PostgreSQL 中有一个名为t1数据库表,例如:

|  Name  |  | StartDate |  | EndDate   |
----------------------------------------
| Oct-18 |  | 2018-10-01|  | 2018-10-05|

我想要日期范围的结果,如:

| Oct-18 | |2018-10-01| |2018-10-02| |2018-10-03| |2018-10-04| |2018-10-05|

generate_series()的帮助下,我可以“垂直”完成,但是如何在一行中获得结果?

使用generate_series() 但是 SQL 不允许动态数量的结果列。 因此,您必须将结果包装在字符串、数组或文档类型中才能使其工作。 LATERAL子查询中使用 ARRAY 构造函数的示例 - 在 Postgres 10 或更高版本中:

SELECT t1.name, d.date_arr::date[]
FROM   t1
LEFT   JOIN LATERAL (
   SELECT ARRAY(SELECT generate_series(t1.startdate::timestamp
                                     , t1.enddate::timestamp
                                     , interval '1 day'))
   ) d(date_arr) ON true;

为什么(最好)Postgres 10 或更高版本?

为什么要转换为timestamp

为什么LEFT JOIN .. ON true

尽管在这种特殊情况下不需要LEFT JOIN (可能是CROSS JOIN ),因为 ARRAY 构造函数总是返回一行。

Postgres 9.1

LATERAL需要 Postgres 9.3 或更高版本。 您可以替换为相关子查询:

SELECT name
     , ARRAY(SELECT generate_series(startdate::timestamp
                                  , enddate::timestamp
                                  , interval '1 day')::date)
FROM   t1;

甚至适用于 pg 8.4:

db<> 在这里摆弄

但请考虑升级到当前版本。

crosstab()

crosstab()也不能克服 SQL 的静态特性。 准备好的行类型的解决方法有限......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM