【问题标题】:How to calculate DATE Difference in PostgreSQL?如何计算 PostgreSQL 中的日期差异?
【发布时间】:2014-09-15 18:34:16
【问题描述】:

这里我需要计算PostgreSQL中两个日期的差值。

在 SQL Server 中:就像我们在 SQL Server 中所做的那样,这要容易得多。

DATEDIFF(Day, MIN(joindate), MAX(joindate)) AS DateDifference;

我的尝试:我正在尝试使用以下脚本:

(Max(joindate) - Min(joindate)) as DateDifference;

问题

  • 我的方法正确吗?

  • PostgreSQL 中是否有任何函数可以计算这个?

【问题讨论】:

    标签: postgresql datediff


    【解决方案1】:

    您的计算对于DATE 类型是正确的,但如果您的值是时间戳,您可能应该使用EXTRACT(或DATE_PART)以确保仅获得完整 天的差异;

    EXTRACT(DAY FROM MAX(joindate)-MIN(joindate)) AS DateDifference
    

    An SQLfiddle to test with。请注意时间戳的差异是 1 秒小于 2 天。

    【讨论】:

    • @JurajPetrik Hm, SELECT EXTRACT(DAY FROM TO_TIMESTAMP('2016-01-01', 'YYYY-MM-DD')-TO_TIMESTAMP('2015-03-01', 'YYYY-MM-DD')); 给出了 306 天,这似乎是正确的(并且大于 31)。
    【解决方案2】:

    将两个字段都转换为数据类型 DATE,您可以使用减号:

    (CAST(MAX(joindate) AS date) - CAST(MIN(joindate) AS date)) as DateDifference
    

    测试用例:

    SELECT  (CAST(MAX(joindate) AS date) - CAST(MIN(joindate) AS date)) as DateDifference
    FROM 
        generate_series('2014-01-01'::timestamp, '2014-02-01'::timestamp, interval '1 hour') g(joindate);
    

    结果:31

    或者创建一个函数 datediff():

    CREATE OR REPLACE FUNCTION datediff(timestamp, timestamp) 
    RETURNS int 
    LANGUAGE sql 
    AS
    $$
        SELECT CAST($1 AS date) - CAST($2 AS date) as DateDifference
    $$;
    

    【讨论】:

    • 创建函数后。我只需要使用datediff(joindate,joindate) 对吗?
    • 在 sql 查询中,它不会自己工作(只是为以后的读者添加这个)
    【解决方案3】:

    这就是我通常的做法。 B减去A的简单天数。

    DATE_PART('day', MAX(joindate) - MIN(joindate)) as date_diff
    

    【讨论】:

    • 我认为如果两个日期不是同一个月,这会产生负日期。
    【解决方案4】:

    一种简单的方法是将日期转换为时间戳并获取它们的差异,然后提取 DAY 部分。

    如果你想要真正的不同

    select extract(day from 'DATE_A'::timestamp - 'DATE_B'::timestamp);
    

    如果你想要绝对差异

    select abs(extract(day from 'DATE_A'::timestamp - 'DATE_B'::timestamp));
    

    【讨论】:

    • 这个问题很老了,所以也许当时没有用,但现在你可以做select date_x - date_y as thing
    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2013-09-02
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多