【问题标题】:PostgreSQL get time difference between timestampsPostgreSQL获取时间戳之间的时间差
【发布时间】:2014-01-18 04:47:22
【问题描述】:

我已经查看了许多与此相关的 SO 问题,但我似乎无法解决任何问题。我不太擅长半复杂的 SQL 查询。

我想获取当前时间与以小时为单位的 unix 时间戳列之间的差异。

我不确定我在这件事上做错了什么。目标是只提取少于 24 小时的行。如果有更好的工作方法或示例,那就太好了。

我从这里Timestamp Difference In Hours for PostgreSQL尝试了几个答案

无论我尝试了多少不同的方法,我都无法让这个查询工作。 wc.postedbigint 存储为 unix timestamp

SELECT w.wal_id, wc.com_id, w.posted AS post_time, wc.posted AS com_time 
FROM wall as w LEFT JOIN wall_comments as wc ON w.wal_id=wc.wal_id 
WHERE (EXTRACT(EPOCH FROM wc.posted)) > current_timestamp - interval '24 hours'

然后是错误:

ERROR:  function pg_catalog.date_part(unknown, bigint) does not exist
LINE 1: ... wall_comments as wc ON w.wal_id=wc.wal_id WHERE (EXTRACT(EP...
                                                             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

********** Error **********

ERROR: function pg_catalog.date_part(unknown, bigint) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Character: 148

这是一个简化的fiddle

【问题讨论】:

    标签: sql postgresql timestamp


    【解决方案1】:

    来自fine manual

    单参数to_timestamp 函数也可用;它接受 double precision 参数并从 Unix 纪元(自 1970-01-01 00:00:00+00 以来的秒数)转换为 timestamp with time zone。 (Integer Unix 纪元被隐式转换为double precision。)

    所以要将您的bigint seconds-since-epoch 转换为timestampz

    to_timestamp(wc.posted)
    

    也许你正在寻找这个:

    WHERE to_timestamp(wc.posted) > current_timestamp - interval '24 hours'
    

    【讨论】:

    • 完美。谢谢,我想该手册很有帮助。但我不太明白它需要使用该函数进行转换。感谢您指出这一点。
    【解决方案2】:

    试试:

    SELECT EXTRACT(EPOCH FROM (timestamp_B - timestamo_A))
    FROM TableA
    

    详情请看:EXTRACT

    【讨论】:

    • 请在 sql fiddle 中发布您的查询
    【解决方案3】:

    试试这个,我相信这会对你有所帮助

    select field_1,field_2,field_3 from schema_name.table_name Where  
    ROUND(EXTRACT(EPOCH FROM (cast(now() as timestamp)  - cast(your_time_field as timestamp)))/60) > 1440;
    

    【讨论】:

    • 不使用强制转换函数,你也可以这样做,now():: timestamp - your_time_field:: timestamp
    【解决方案4】:

    报错信息:

    提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

    确实,最简单的解决方案是添加显式时间戳类型转换

    SELECT w.wal_id, wc.com_id, w.posted AS post_time, wc.posted AS com_time 
    FROM wall as w LEFT JOIN wall_comments as wc ON w.wal_id=wc.wal_id 
    WHERE (EXTRACT(EPOCH FROM wc.posted::timestamp)) > current_timestamp - interval '24 hours'
    

    注意演员表:

    wc.posted::timestamp
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-28
      • 2014-05-22
      • 2021-03-22
      • 2011-06-13
      • 2022-01-26
      • 2017-05-12
      • 2011-08-18
      • 2021-07-31
      相关资源
      最近更新 更多