[英]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.