繁体   English   中英

PostgreSQL 的时间戳差异(以小时为单位)

[英]Timestamp Difference In Hours for PostgreSQL

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"

第一件事突然爆发了

EXTRACT(EPOCH FROM current_timestamp-somedate)/3600

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

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

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

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

获取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'

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

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

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

所以更安全的方法是:

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

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

您可以在间隔和时间戳上使用“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)

postgresql获取时间戳之间的秒差

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

打印:

-2

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

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

但是在详尽的问题思考,使用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。 哈! 不要被愚弄。

如果time-intitialized是postgresql时间戳,则无法执行DELETE FROM SESSION_TABLE WHERE time-initialized < '2 days' 但你可以这样做:

DELETE FROM SESSION_TABLE WHERE time_initialized < '$yesterday'

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

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

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

你可以用php日期对象做加法,减法,<,>

_peter_sysko U4EA Networks,Inc。

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

为了避免纪元转换,您可以提取天数乘以 24 并添加小时数的提取。

select current_timestamp, (current_timestamp - interval '500' hour), (extract(day from (current_timestamp - (current_timestamp - interval '500' hour)) * 24) + extract(hour from (current_timestamp - (current_timestamp - interval '500' hour))));

对于 MySQL timestampdiff 我不知道,但对于 MSSQL datediff(hour, start, end) PostgreSQL 中最好的等价物是 floor(extract(epoch from end - start)/3600),因为在 MSSQL 中选择 datediff(hour,'2021 -10-31 18:00:00.000', '2021-10-31 18:59:59.999') 返回 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM