从日期范围创建日期和小时列

Posted

技术标签:

【中文标题】从日期范围创建日期和小时列【英文标题】:Create date and hour columns from date range 【发布时间】:2019-06-12 00:55:03 【问题描述】:

我想创建一个临时表,在其中给它一个开始和结束日期(定价)。然后结果是一列中的日期和另一列中的每一天的小时。

看起来像这样:

date       hour
------------------
1/17/19     1
1/17/19     2
1/17/19     3
   .        .
   .        .
1/17/19    24
1/18/19     1
1/18/19     2
1/18/19     3
   .        .
   .        .
   .        .

所以我似乎想在一个小时内使用 generate_series。但不确定如何将其与日期匹配。

这不是为我完成的:

WITH hrs AS (SELECT * FROM generate_series(1,24)),
pricedate AS (SELECT * FROM generate_series('2018-01-24', '2018-01-26', interval '1 day'))


SELECT pricedate, hrs
WHERE pricedate BETWEEN '2018-01-24' AND '2018-01-26'
ORDER BY pricedate, hour

【问题讨论】:

【参考方案1】:
select d::date as date, extract(hour from d)::int+ 1 as hour
from generate_series('2018-01-24', '2018-01-26 23:00', interval '1 hour') s(d)

    date    | hour 
------------+------
 2018-01-24 |    1
 2018-01-24 |    2
 2018-01-24 |    3
 2018-01-24 |    4
...

【讨论】:

什么是“s(d)”部分?我不熟悉这种语法。那是在做什么?将其定义为一个名为“d”的系列? 它是一个带有列名的别名。是的,它将生成的时间戳定义为d 为什么是 s(d),而不仅仅是“AS d”?这只是你的风格? s(d) 更正式。 s 就像一个表名,d 是一个列。因此你可以使用select s.d ... 但总的来说这是风格问题。 这只给出最后一天的第 1 小时。【参考方案2】:

使用cross join

WITH hrs AS (
       SELECT gs.hr
       FROM generate_series(1,24) gs(hr)
      ),
      pricedate AS (
       SELECT gs.priceate
       FROM generate_series('2018-01-24', '2018-01-26', interval '1 day') gs(pricedate)
      )
SELECT pricedate.pricedate, hrs.hr
FROM hrs CROSS JOIN pricedate
WHERE pricedate.pricedate BETWEEN '2018-01-24' AND '2018-01-26'
ORDER BY pricedate.pricedate, hrs.hour

【讨论】:

不错。我认为您甚至不需要 where 子句。我忘记了交叉连接功能!这就是它的关键。

以上是关于从日期范围创建日期和小时列的主要内容,如果未能解决你的问题,请参考以下文章

熊猫从日期范围列中提取开始和结束日期[重复]

如何创建一个新列来指定日期所属的年份范围(如学年)?

根据日期范围过滤列

Highcharts 复列范围图

t-sql 从平面日期列表中总结日期范围,按其他列分组

如何获取指定日期范围的值?