PostgreSQL:将间隔格式化为分钟
当我减去时间戳时,间隔的形式是DD:HH:MM:SS。我怎样才能在不提取天、小时和乘法/加法的情况下将其全部转换为分钟?我正在寻找一个函数,我可以在这个查询中用它代替PostgreSQL:将间隔格式化为分钟,postgresql,Postgresql,当我减去时间戳时,间隔的形式是DD:HH:MM:SS。我怎样才能在不提取天、小时和乘法/加法的情况下将其全部转换为分钟?我正在寻找一个函数,我可以在这个查询中用它代替date\u part,以便它返回65: select date_part('minutes', '65 minutes'::interval); 上下文:我需要知道从给定的时间戳到现在已经过去了多少分钟。事实上,我认为如果不做一些奇怪的事情(比如去查),你是不可能做到的,因为分钟是59分钟。这就是为什么你会得到: postgre
date\u part
,以便它返回65:
select date_part('minutes', '65 minutes'::interval);
上下文:我需要知道从给定的时间戳到现在已经过去了多少分钟。事实上,我认为如果不做一些奇怪的事情(比如去查),你是不可能做到的,因为分钟是59分钟。这就是为什么你会得到:
postgres=# select date_part('minutes', '65 minutes'::interval);
date_part
-----------
5
(1 row)
postgres=# select '65 minutes'::interval
postgres-# ;
interval
----------
01:05:00
(1 row)
似乎有效
警告:“似乎”是关键词。正如前面的答案所指出的,诀窍是将间隔转换为“历元”,即绝对秒数,然后适当地除以其他单位的绝对数 几年前,我写了一篇文章,将这一点推广到
date\u part
接受的大多数论点,假设一个月是30天,一年是365.25天
您可以随意使用和修改:
CREATE FUNCTION
interval_convert(in_unit text, in_interval interval)
RETURNS double precision
AS $FUNC$
SELECT
EXTRACT(
EPOCH FROM
$2 -- in_interval
)
/
-- Slightly lazy way of allowing both singular and plural
-- has side effect that 'centurie' and 'centurys' are accepted
-- but otherwise behaves similarly to DATE_TRUNC
CASE TRIM(TRAILING 's' FROM LOWER(
$1 -- in_unit
))
WHEN 'microsecond' THEN 0.000001
WHEN 'millisecond' THEN 0.001
WHEN 'second' THEN 1
WHEN 'minute' THEN 60
WHEN 'hour' THEN 3600
WHEN 'day' THEN 86400
WHEN 'week' THEN 604800
WHEN 'month' THEN 2592000 -- 30 days
-- WHEN 'quarter' THEN -- Not supported
WHEN 'year' THEN 31557600 -- 365.35 days
WHEN 'decade' THEN 315576000
WHEN 'century' THEN 3155760000
WHEN 'centurie' THEN 3155760000
WHEN 'millennium' THEN 31557600000
WHEN 'millennia' THEN 31557600000
END
$FUNC$
LANGUAGE sql
IMMUTABLE
RETURNS NULL ON NULL INPUT;
谢谢我知道我有什么问题,我正在寻找最优雅的解决方案。是的。“epoch”返回秒数。谢谢
CREATE FUNCTION
interval_convert(in_unit text, in_interval interval)
RETURNS double precision
AS $FUNC$
SELECT
EXTRACT(
EPOCH FROM
$2 -- in_interval
)
/
-- Slightly lazy way of allowing both singular and plural
-- has side effect that 'centurie' and 'centurys' are accepted
-- but otherwise behaves similarly to DATE_TRUNC
CASE TRIM(TRAILING 's' FROM LOWER(
$1 -- in_unit
))
WHEN 'microsecond' THEN 0.000001
WHEN 'millisecond' THEN 0.001
WHEN 'second' THEN 1
WHEN 'minute' THEN 60
WHEN 'hour' THEN 3600
WHEN 'day' THEN 86400
WHEN 'week' THEN 604800
WHEN 'month' THEN 2592000 -- 30 days
-- WHEN 'quarter' THEN -- Not supported
WHEN 'year' THEN 31557600 -- 365.35 days
WHEN 'decade' THEN 315576000
WHEN 'century' THEN 3155760000
WHEN 'centurie' THEN 3155760000
WHEN 'millennium' THEN 31557600000
WHEN 'millennia' THEN 31557600000
END
$FUNC$
LANGUAGE sql
IMMUTABLE
RETURNS NULL ON NULL INPUT;