如何使用 postgres 将时间间隔转换为小时数?
Posted
技术标签:
【中文标题】如何使用 postgres 将时间间隔转换为小时数?【英文标题】:How do I convert an interval into a number of hours with postgres? 【发布时间】:2009-06-04 19:08:19 【问题描述】:假设我有一个间隔
4 days 10:00:00
在 postgres 中。如何将其转换为小时数(在这种情况下为 106?)是否有功能或者我应该硬着头皮做类似的事情
extract(days, my_interval) * 24 + extract(hours, my_interval)
【问题讨论】:
注意:如果您的时间间隔包含月或年,则没有明确的答案来确定有多少小时,因为一个月或一年中的天数会有所不同。所以要小心! @Teddy:更准确地说,有多个定义的答案;) 【参考方案1】:可能最简单的方法是:
SELECT EXTRACT(epoch FROM my_interval)/3600
【讨论】:
如果间隔包含分钟和/或秒,则可能会将结果取整或转换为整数 提取纪元?哦,天哪,一百万年后我都不会想到。 SELECT EXTRACT(epoch FROM my_interval/3600)(interval 具有原生的“除整数”支持,结果是间隔,提取结果是整数,而不是浮点数)。所以。自动投射/地板完成。 警告:简单地提取 epoch 隐含假设一个月 = 30 天,一年 = 365.25 天。 @Teddy 我们能用它做什么?如何避免这个问题并获得真实的纪元数?【参考方案2】:如果你想要整数,即天数:
SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int
【讨论】:
太棒了!谢谢你 :) 然而,我发现我们现在可以将其修改为SELECT extract('epoch' FROM age('2014-08-02'::timestamp)) / 86400
(我使用的是 Pg 9.4),因为 age(ts)
只有一个参数时会自动使用 CURRENT_DATE
。
警告:简单地提取 epoch 隐含假设一个月 = 30 天,一年 = 365.25 天。【参考方案3】:
要获得天数,最简单的方法是:
SELECT EXTRACT(DAY FROM NOW() - '2014-08-02 08:10:56');
据我所知,它会返回与以下内容相同的内容:
SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int;
【讨论】:
如果你的区间是'1 month 0 days'
,使用extract(day from …)
会得到0
作为结果。【参考方案4】:
select floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600)), count(*)
from od_a_week
group by floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600));
::int
转换遵循四舍五入的原则。
如果你想要一个不同的结果比如向下取整,你可以使用对应的数学函数比如floor
。
【讨论】:
【参考方案5】:如果你转换表格字段:
定义字段,使其包含秒数:
CREATE TABLE IF NOT EXISTS test (
...
field INTERVAL SECOND(0)
);
提取值。 记住转换为 int 否则,一旦间隔很大,您可能会得到一个令人不快的惊喜:
EXTRACT(EPOCH FROM field)::int
【讨论】:
我认为 Redshift 不支持 INTERVAL 数据类型。它只是 BIGINT。【参考方案6】:我正在使用 PostgreSQL 11,我创建了一个函数来获取 2 个不同时间戳之间的小时数
create function analysis.calcHours(datetime1 timestamp, datetime2 timestamp)
returns integer
language plpgsql as $$
declare
diff interval;
begin
diff = datetime2 - datetime1;
return (abs(extract(days from diff))*24 + abs(extract(hours from diff)))::integer;
end; $$;
【讨论】:
【参考方案7】: select date 'now()' - date '1955-12-15';
这是计算总天数的简单查询。
【讨论】:
不带区间值。以上是关于如何使用 postgres 将时间间隔转换为小时数?的主要内容,如果未能解决你的问题,请参考以下文章