PostgreSQL的时间戳差异小时数

The*_*ing 54 sql postgresql timestamp

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

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

我可以在MySQL中这样做:

TIMESTAMPDIFF(HOUR, links.created, NOW())
Run Code Online (Sandbox Code Playgroud)

我只需要以小时表示的两个时间戳之间的差异表示为整数.

解决方案对我有用:

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

Mic*_*ker 79

第一件事突然爆发了

EXTRACT(EPOCH FROM current_timestamp-somedate)/3600
Run Code Online (Sandbox Code Playgroud)

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

编辑:如果你想要大于零,可以使用abs或者最大值(...,0).哪个适合你的意图.

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

select age(current_timestamp);
       age        
------------------
 -00:52:40.826309
(1 row)
Run Code Online (Sandbox Code Playgroud)


Eri*_*ski 28

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

SELECT * from yourtable 
WHERE your_timestamp_field > to_date('05 Dec 2000', 'DD Mon YYYY');
Run Code Online (Sandbox Code Playgroud)

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

SELECT * from yourtable 
WHERE your_timestamp_field > current_timestamp - interval '5 minutes'
Run Code Online (Sandbox Code Playgroud)

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

SELECT * from yourtable 
WHERE your_timestamp_field > current_timestamp - interval '5 hours'
Run Code Online (Sandbox Code Playgroud)


Sha*_*umo 15

Michael Krelin的答案很接近并不完全安全,因为在极少数情况下它可能是错误的.问题是PostgreSQL中的间隔没有关于夏令时等内容的上下文.间隔内部存储的内容为数月,日和秒.在这种情况下,月份不是问题,因为减去两个时间戳只使用天和秒,但"天"可能是个问题.

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

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

所以更安全的方法是:

(EXTRACT(EPOCH FROM current_timestamp) - EXTRACT(EPOCH FROM somedate))/3600
Run Code Online (Sandbox Code Playgroud)

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


ara*_*nid 7

您可以在间隔和时间戳上使用"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)
Run Code Online (Sandbox Code Playgroud)


Eri*_*ski 5

postgresql获取时间戳之间的秒差

SELECT (
    (extract (epoch from (
        '2012-01-01 18:25:00'::timestamp - '2012-01-01 18:25:02'::timestamp
                         )
             )
    )
)::integer
Run Code Online (Sandbox Code Playgroud)

打印:

-2
Run Code Online (Sandbox Code Playgroud)

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