PostgreSQL的时间戳差异小时数

时间:2009-12-26 22:42:21

标签: sql postgresql timestamp

PostgreSQL是否有TIMESTAMPDIFF()个等价物?

我知道我可以减去两个时间戳来获得postgresql INTERVAL。我只想要INT中表示的两个时间戳之间的差异。

我可以在MySQL中这样做:

TIMESTAMPDIFF(HOUR, links.created, NOW())

我只需要以小时表示的两个时间戳之间的差异。

解决方案对我有用:

SELECT "links_link"."created",
"links_link"."title",
(EXTRACT(EPOCH FROM current_timestamp - "links_link"."created")/3600)::Integer AS "age" 
FROM "links_link"

7 个答案:

答案 0 :(得分:72)

首先出现的事情

EXTRACT(EPOCH FROM current_timestamp-somedate)/3600

可能不是很漂亮,但可以畅通无阻。如果定义了间隔间隔的划分,可能会更漂亮。

编辑:如果您希望大于零,请使用abs或maximum(...,0)。适合您的意图。

编辑++ :我没有使用age的原因是age只有一个参数,引用文档:从current_date减去(at午夜)即可。这意味着除非在午夜运行,否则您无法获得准确的“年龄”。现在几乎是凌晨1点:

select age(current_timestamp);
       age        
------------------
 -00:52:40.826309
(1 row)

答案 1 :(得分:25)

获取时间戳大于postgresql中日期的字段:

SELECT * from yourtable 
WHERE your_timestamp_field > to_date('05 Dec 2000', 'DD Mon YYYY');

从postgresql中的时间戳减去分钟:

SELECT * from yourtable 
WHERE your_timestamp_field > current_timestamp - interval '5 minutes'

从postgresql中的时间戳减去小时数:

SELECT * from yourtable 
WHERE your_timestamp_field > current_timestamp - interval '5 hours'

答案 2 :(得分:13)

迈克尔·克瑞林的回答并不完全是安全的,因为在极少数情况下它可能是错误的。问题是PostgreSQL中的间隔没有关于夏令时等内容的上下文。间隔内部存储的内容为数月,日和秒。在这种情况下,月份不是问题,因为减去两个时间戳只使用天和秒,但“天”可能是个问题。

如果您的减法涉及夏令时转换,则某一天可能分别被视为23或25小时。间隔将考虑到这一点,这对于了解符号意义上传递的天数很有用,但它会给出错误的实际小时数。间隔期限将使所有天数乘以24小时。

例如,如果完整的“短”日和第二天的额外小时,则间隔将记录为一天一小时。转换为epoch / 3600的是25小时。但实际上23小时+ 1小时应该总共24小时。

所以更安全的方法是:

(EXTRACT(EPOCH FROM current_timestamp) - EXTRACT(EPOCH FROM somedate))/3600

正如迈克尔在后续评论中提到的那样,你也可能想要使用floor()或round()来将结果作为整数值。

答案 3 :(得分:6)

您可以在间隔和时间戳上使用“extract”或“date_part”函数,但我认为这不符合您的要求。例如,它给出3个间隔为“2天,3小时”。但是,您可以通过将“epoch”指定为所需的时间元素将时间间隔转换为秒数:extract(epoch from '2 days, 3 hours'::interval)返回183600(然后除以3600将秒转换为小时)。

所以,把这一切放在一起,你基本上得到迈克尔的回答:extract(epoch from timestamp1 - timestamp2)/3600。由于您似乎并不关心哪个时间戳位于哪个之前,您可能希望将其包装在abs中:

SELECT abs(extract(epoch from timestamp1 - timestamp2)/3600)

答案 4 :(得分:3)

postgresql获取时间戳之间的秒差

SELECT (
    (extract (epoch from (
        '2012-01-01 18:25:00'::timestamp - '2012-01-01 18:25:02'::timestamp
                         )
             )
    )
)::integer

打印:

-2

因为时间戳相隔两秒钟。取数字除以60得到分钟,再除以60得到几小时。

答案 5 :(得分:2)

对于许多喜欢利用数据库功能的开发人员来说,这可能听起来很疯狂,

但是在详尽的问题思考,使用php比较日期函数创建和修复mysql和postgrsql的应用程序之后,我得出结论(对我自己而言),最简单的方法,即最简单的SQL头痛不是利用他们中的任何一个。

为什么呢?因为如果您使用像PHP这样的中间件语言进行开发,PHP具有所有这些功能,并且在比较整数时,它们更容易在应用程序中实现。 PostgreSQL时间戳是NOT == UNIX TIMESTAMP,MySQL的UNIX TIMESTAMP不是PostgresQL或Oracles时间戳..如果你使用数据库时间戳,它会更难移植..

所以只使用整数,而不是时间戳, 作为自1970年1月1日午夜以来的秒数。并且不介意数据库时间戳。 ,并使用gmdate()并将所有内容存储为gmt时间以避免时区问题。

如果您需要在应用程序中搜索,排序或比较其他数据,或月份或年份或星期几或任何内容的日期, time_day,time_hour,time_seconds等的INTEGER数据类型或者您要搜索索引的任何内容都将使数据库更加平滑和便携。 你可以在大多数情况下使用一个字段:INTEGER time_created NOT NULL

(您的数据库行中的更多字段是我找到的此解决方案的唯一缺点,并且不会导致许多头痛或一杯咖啡:)

php的日期函数非常适合比较日期, 但在mysql或postgresql中,比较日期? nah ..使用整数sql比较

我意识到在插入函数上使用CURRENT_TIMESTAMP可能更容易。哈! 不要被愚弄。

你不能DELETE FROM SESSION_TABLE WHERE time-initialized < '2 days' 如果time-intitialized是postgresql时间戳。 但你可以这样做:

DELETE FROM SESSION_TABLE WHERE time_initialized < '$yesterday'

只要你将PHP中的$昨天设置为1970年以来的秒数整数,那就是昨天。

与比较postgresql select语句中的时间戳相比,这更容易管理会话记录。

SELECT age(),SELECT extract()和asbtime本身就是令人头疼的问题。这只是我的看法。

你可以使用php日期对象进行加法,减法,&lt;,&gt;所有

_peter_sysko U4EA Networks,Inc。

答案 6 :(得分:1)

extract(hour from age(now(),links.created))为您提供小时差异的全面计算。