PostgreSQL 时间维度按小时和天错误

问题描述

我正在 PostgreSQL 中使用 DATE_ID 和 DATE_DESC 构建时间维度表。 我的 T-SQL(完美运行)脚本是:

set DATEFIRST 1
 ;WITH DATES AS (
    SELECT CAST('2019-01-01 00:00:00.000' AS datetime) AS [DATE]
    UNION ALL
    SELECT DATEADD(HH,1,[DATE])
    FROM DATES
    WHERE DATEADD(HH,[DATE]) <= CAST('2019-12-31' AS datetime)
)
SELECT
DATE_ID,DATE_DESC
from
(
SELECT  
CONVERT(int,CONVERT(char(8),DATE,112)) AS DATE_ID,DATE AS DATE_DESC
FROM
    DATES)a
order by 1
OPTION (MAXRECURSION 0)

目前我正在尝试将此代码转换为 PostgreSQL 可读的代码,但它不起作用.. 这是我目前的:

set EXTRACT(DOW FROM TIMESTAMP  '2019-01-01 00:00:00.000')+1
;WITH DATES AS (
    SELECT CAST('2019-01-01 00:00:00.000' AS timestamp) AS DATE
    UNION ALL
    SELECT CURRENT_DATE + INTERVAL '1 hour'
    FROM DATES
    WHERE CURRENT_DATE + INTERVAL '1 hour' <= CAST('2019-12-31' AS timestamp)
)

SELECT DATE_ID,DATE_DESC from
(SELECT  cast(to_char((DATE)::TIMESTAMP,'yyyymmddhhmiss') as BIGInt) AS DATE_ID,DATE AS DATE_DESC
FROM
    DATES)a
order by 1
OPTION (MAXRECURSION 0)

我需要 2019-01-01 和 2019-12-31 之间的所有时间(24 小时)。目前我认为 OPTION (MAXRECURSION 0)set EXTRACT(DOW FROM TIMESTAMP '2019-01-01 00:00:00.000')+1 工作不正常。

解决方法

这是递归CTE的问题,在Postgresql中,你想要的查询如下

WITH recursive DATES AS (
    SELECT CAST('2019-01-01 00:00:00.000' AS timestamp) AS date_
    UNION ALL
    SELECT date_ + INTERVAL '1 hour'
    FROM DATES
    WHERE date_ + INTERVAL '1 hour' <= CAST('2019-12-31' AS timestamp)
)

SELECT DATE_ID,DATE_DESC from
(SELECT  cast(to_char((date_)::TIMESTAMP,'yyyymmddhhmiss') as BIGInt) AS DATE_ID,date_ AS DATE_DESC
FROM
    DATES)a
order by 1

DEMO

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...