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).哪个适合你的意图.
编辑++:我没有使用的原因age
是age
使用单个参数引用文档:从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()来将结果作为整数值.
您可以在间隔和时间戳上使用"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)
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得到小时。