PostgreSQL:如何计算PostgreSQL中的DATE差异?

Mee*_*eem 14 postgresql datediff

在这里,我需要计算PostgreSQL中两个日期的差异.

在SQL Server中:就像我们在SQL Server中一样,它更容易.

DATEDIFF(Day, MIN(joindate), MAX(joindate)) AS DateDifference;
Run Code Online (Sandbox Code Playgroud)

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

(Max(joindate) - Min(joindate)) as DateDifference;
Run Code Online (Sandbox Code Playgroud)

问题:

  • 我的方法是否正确?

  • PostgreSQL中是否有任何函数来计算它?

Joa*_*son 22

你的计算正确DATE的类型,但如果你的价值观是时间戳,你应该使用EXTRACT (或date_part数)是一定要得到只有在差异充分天;

EXTRACT(DAY FROM MAX(joindate)-MIN(joindate)) AS DateDifference
Run Code Online (Sandbox Code Playgroud)

一个要测试的SQLfiddle.请注意,时间戳差异为1秒,少于2整天.

  • @JurajPetrik Hm,`选择提取(DAY FROM TO_TIMESTAMP('2016-01-01','YYYY-MM-DD')-TO_TIMESTAMP('2015-03-01','YYYY-MM-DD'));`给出 306 天,这似乎是正确的(并且大于 31 天)。 (2认同)

Fra*_*ens 7

CAST这两个字段的数据类型为DATE,您可以使用减号:

(CAST(MAX(joindate) AS date) - CAST(MIN(joindate) AS date)) as DateDifference
Run Code Online (Sandbox Code Playgroud)

测试用例:

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);
Run Code Online (Sandbox Code Playgroud)

结果: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
$$;
Run Code Online (Sandbox Code Playgroud)


zub*_*r-0 7

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

如果你想要真正的区别

select extract(day from 'DATE_A'::timestamp - 'DATE_B'::timestamp);
Run Code Online (Sandbox Code Playgroud)

如果你想要绝对的差异

select abs(extract(day from 'DATE_A'::timestamp - 'DATE_B'::timestamp));
Run Code Online (Sandbox Code Playgroud)

  • 这个问题很老了,所以也许当时它不起作用,但现在你可以做“select date_x - date_y as thing” (7认同)

小智 7

这不是OP问题的直接答案,但是,当我的搜索将我带到这个帖子时,这是我正在寻找的答案。

对于想要创建一个人类可读的字符串来表示两个日期之间的差异的人,请考虑使用 AGE()。

 AGE(table.end_date, table.start_date)

Run Code Online (Sandbox Code Playgroud)

它产生如下所示的结果:

0:00:27

3 days 22:06:39.833264
4 days 01:12:39.473559
20 days 17:53:20.23287
23 days 21:01:15.150703

1 mon 19 days 01:52:24.262275
2 mons 17 days 05:04:12.277099
2 mons 17 days 04:59:21.618069
Run Code Online (Sandbox Code Playgroud)


ano*_*raq 6

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

DATE_PART('day', MAX(joindate) - MIN(joindate)) as date_diff
Run Code Online (Sandbox Code Playgroud)