【问题标题】:using date-diff function in PostgreSQL在 PostgreSQL 中使用 date-diff 函数
【发布时间】:2015-01-01 21:48:45
【问题描述】:

我在 sql server 中使用下面的查询,它工作正常,但现在我们开始使用 Netezza,查询停止工作。我怀疑 datediff 函数在新西兰不起作用。我是 Netezza 的新手——请帮忙。这是完整的查询

SET NOCOUNT ON
GO

    DECLARE @DataSource TABLE
    (
         [PATIENT_ID] TINYINT
        ,[ADMIT_DATE] DATE
        ,[LOCATION] VARCHAR(3)
    )

    INSERT INTO @DataSource ([PATIENT_ID], [ADMIT_DATE], [LOCATION])
    VALUES (33, '1-10-2014', 'ER')
          ,(33, '1-11-2014', 'ER')
          ,(33, '1-15-2014', 'ER')
          ,(33, '1-17-2014', 'ER')
          ,(45, '2-15-2014', 'OBS')
          ,(45, '2-16-2014', 'OBS')
          ,(45, '2-20-2014', 'OBS')
          ,(45, '2-25-2014', 'OBS')
          ,(45, '2-27-2014', 'OBS')

;WITH TempDataSource ([PATIENT_ID], [ADMIT_DATE], [LOCATION], [Rank])  AS
(
    SELECT [PATIENT_ID]
          ,[ADMIT_DATE]
          ,[LOCATION]
          ,ROW_NUMBER() OVER (PARTITION BY [PATIENT_ID], [LOCATION] ORDER BY [ADMIT_DATE] ASC)
    FROM @DataSource    
)

,DataSource ([PATIENT_ID], [ADMIT_DATE], [LOCATION], [DIFF_IN_HOURS]) AS
(
SELECT DS1.[PATIENT_ID]
      ,DS1.[ADMIT_DATE]
      ,DS1.[LOCATION]
      ,DATEDIFF(HOUR, DS2.[ADMIT_DATE], DS1.[ADMIT_DATE])
FROM TempDataSource DS1
LEFT JOIN TempDataSource DS2
    ON DS1.[Rank] - 1 = DS2.[Rank]
    AND DS1.[PATIENT_ID] = DS2.[PATIENT_ID]
    AND DS1.[LOCATION] = DS2.[LOCATION]
)
SELECT [PATIENT_ID]
      ,[ADMIT_DATE]
      ,[LOCATION]
      ,ROW_NUMBER() OVER (PARTITION BY [PATIENT_ID], [LOCATION] ORDER BY [ADMIT_DATE] ASC)
FROM DataSource
WHERE [DIFF_IN_HOURS] >= 48

【问题讨论】:

    标签: postgresql datediff netezza


    【解决方案1】:

    在PostgreSQL中没有datediff函数,但是你可以在一个区间上使用带有date_part函数的各种表达式,例如:

    DATE_PART('day', end - start) * 24 + DATE_PART('hour', end - start )
    

    或者以更合同的方式

    DATE_PART('epoch', end - start) / 3600
    

    【讨论】:

    • 我已经看到了,但无法将其应用于我的查询。
    • 但是当你减去两个日期时,你会得到 PostgreSQL 中的天数。 postgresql.org/docs/9.3/static/functions-datetime.html。请注意日期格式。
    • 是的,如果 DS2.[ADMIT_DATE]DS1.[ADMIT_DATE] 是日期,当您减去 DS2.[ADMIT_DATE] - DS1.[ADMIT_DATE] 时,您会得到天数。在这种情况下,您有两个选择:CAST 日期时间戳并使用 DATE_PART 函数或使用此表达式:(DS2.[ADMIT_DATE] - DS1.[ADMIT_DATE]) * 24
    【解决方案2】:

    这就是我将 SQL Server 代码转换为在 Netezza 中工作的方式

        create temp table tmp_DataSource
        (
             PATIENT_ID smallint
            ,ADMIT_DATE timestamp
            ,LOCATION VARCHAR(3)
        );
    
        INSERT INTO tmp_DataSource(PATIENT_ID, ADMIT_DATE, LOCATION) VALUES (33, '1-10-2014 00:00:00', 'ER');
        INSERT INTO tmp_DataSource(PATIENT_ID, ADMIT_DATE, LOCATION) VALUES (33, '1-11-2014 00:01:00', 'ER');
        INSERT INTO tmp_DataSource(PATIENT_ID, ADMIT_DATE, LOCATION) VALUES (33, '1-15-2014', 'ER');
        INSERT INTO tmp_DataSource(PATIENT_ID, ADMIT_DATE, LOCATION) VALUES (33, '1-17-2014', 'ER');
        INSERT INTO tmp_DataSource(PATIENT_ID, ADMIT_DATE, LOCATION) VALUES (45, '2-15-2014', 'OBS');
        INSERT INTO tmp_DataSource(PATIENT_ID, ADMIT_DATE, LOCATION) VALUES (45, '2-16-2014', 'OBS');
        INSERT INTO tmp_DataSource(PATIENT_ID, ADMIT_DATE, LOCATION) VALUES (45, '2-20-2014', 'OBS');
        INSERT INTO tmp_DataSource(PATIENT_ID, ADMIT_DATE, LOCATION) VALUES (45, '2-25-2014', 'OBS');
        INSERT INTO tmp_DataSource(PATIENT_ID, ADMIT_DATE, LOCATION) VALUES (45, '2-27-2014', 'OBS');
    
    create temp table TempDataSource as
        SELECT PATIENT_ID
              ,ADMIT_DATE
              ,LOCATION
              ,ROW_NUMBER() OVER (PARTITION BY PATIENT_ID, LOCATION ORDER BY ADMIT_DATE ASC) as rank
        FROM tmp_DataSource;
    
    create temp table DataSource as
    SELECT DS1.PATIENT_ID
          ,DS1.ADMIT_DATE
          ,DS1.LOCATION
          ,extract(epoch  from (DS1.ADMIT_DATE - DS2.ADMIT_DATE))/3600.0 as DIFF_IN_HOURS
    
    FROM TempDataSource DS1
    LEFT JOIN TempDataSource DS2
        ON DS1.Rank - 1 = DS2.Rank
        AND DS1.PATIENT_ID = DS2.PATIENT_ID
        AND DS1.LOCATION = DS2.LOCATION;
    
    SELECT PATIENT_ID
          ,ADMIT_DATE
          ,LOCATION
          ,ROW_NUMBER() OVER (PARTITION BY PATIENT_ID, LOCATION ORDER BY ADMIT_DATE ASC)
    FROM DataSource
    WHERE DIFF_IN_HOURS >= 48;
    

    【讨论】:

    • 您不需要 Postgres 中的临时表。您也可以在那里使用 CTE。
    • 问题有一个Netezza 标签。
    猜你喜欢
    • 2020-11-18
    • 1970-01-01
    • 2020-04-23
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    相关资源
    最近更新 更多