将 PostgreSQL 查询细分为周、天、小时、分钟、秒
PostgreSQL query to breakdown interval into weeks, days, hours, minutes, seconds
我在 PostgreSQL 方面经验不足,我正在尝试获取一行返回从当前日期时间到给定日期时间的间隔,将周、天、小时、分钟和秒分解为单独的列。
除了一个非常复杂的解决方案之外,我得到的最接近的是:
SELECT
(CURRENT_TIMESTAMP - '2021-01-01 00:00:00')::text AS str,
SUBSTRING((CURRENT_TIMESTAMP - '2021-01-01 00:00:00')::text FROM 1 FOR 2)::NUMERIC AS days,
SUBSTRING((CURRENT_TIMESTAMP - '2021-01-01 00:00:00')::text FROM 9 FOR 2)::NUMERIC AS hours,
SUBSTRING((CURRENT_TIMESTAMP - '2021-01-01 00:00:00')::text FROM 12 FOR 2)::NUMERIC AS minutes,
SUBSTRING((CURRENT_TIMESTAMP - '2021-01-01 00:00:00')::text FROM 15 FOR 2)::NUMERIC AS seconds
这让我很接近:
我的问题是:
- 此实现依赖于
X days
子字符串中的字符数始终相同,但事实并非如此,那么如何使其更灵活?
- 我可以将
(CURRENT_TIMESTAMP - '2021-01-01 00:00:00')::text
的结果保存到一个简单的变量中,这样我就不必重复了吗?
- 如何添加 'weeks' 列并获得
5 weeks, 5 days, ...
而不是 40 days
?
我看过,但我不要月
如果我可以将每个结果的输出保存到一个变量中,我可以像这样做一些相对干净的事情:
感谢任何帮助。谢谢!
您可以使用extract()
SELECT (CURRENT_TIMESTAMP - '2021-01-01 00:00:00')::text AS str,
extract(day from CURRENT_TIMESTAMP - '2021-01-01 00:00:00')as days,
extract(hour from CURRENT_TIMESTAMP - '2021-01-01 00:00:00')as hours,
extract(minute from CURRENT_TIMESTAMP - '2021-01-01 00:00:00')as minutes,
extract(second from CURRENT_TIMESTAMP - '2021-01-01 00:00:00')as seconds;
为避免重复表达式,您可以使用 common table expression:
with input (duration) as (
values (CURRENT_TIMESTAMP - '2021-01-01 00:00:00')
)
select duration::text as str,
extract(day from duration) as days,
extract(hour from duration) as hours,
extract(minute from duration) as minutes,
extract(second from duration) as seconds
from input;
你不能从间隔中得到“周”,但你可以使用 justify_interval()
来转换天数 to months
我在 PostgreSQL 方面经验不足,我正在尝试获取一行返回从当前日期时间到给定日期时间的间隔,将周、天、小时、分钟和秒分解为单独的列。
除了一个非常复杂的解决方案之外,我得到的最接近的是:
SELECT
(CURRENT_TIMESTAMP - '2021-01-01 00:00:00')::text AS str,
SUBSTRING((CURRENT_TIMESTAMP - '2021-01-01 00:00:00')::text FROM 1 FOR 2)::NUMERIC AS days,
SUBSTRING((CURRENT_TIMESTAMP - '2021-01-01 00:00:00')::text FROM 9 FOR 2)::NUMERIC AS hours,
SUBSTRING((CURRENT_TIMESTAMP - '2021-01-01 00:00:00')::text FROM 12 FOR 2)::NUMERIC AS minutes,
SUBSTRING((CURRENT_TIMESTAMP - '2021-01-01 00:00:00')::text FROM 15 FOR 2)::NUMERIC AS seconds
这让我很接近:
我的问题是:
- 此实现依赖于
X days
子字符串中的字符数始终相同,但事实并非如此,那么如何使其更灵活? - 我可以将
(CURRENT_TIMESTAMP - '2021-01-01 00:00:00')::text
的结果保存到一个简单的变量中,这样我就不必重复了吗? - 如何添加 'weeks' 列并获得
5 weeks, 5 days, ...
而不是40 days
?
我看过,但我不要月
如果我可以将每个结果的输出保存到一个变量中,我可以像这样做一些相对干净的事情:
感谢任何帮助。谢谢!
您可以使用extract()
SELECT (CURRENT_TIMESTAMP - '2021-01-01 00:00:00')::text AS str,
extract(day from CURRENT_TIMESTAMP - '2021-01-01 00:00:00')as days,
extract(hour from CURRENT_TIMESTAMP - '2021-01-01 00:00:00')as hours,
extract(minute from CURRENT_TIMESTAMP - '2021-01-01 00:00:00')as minutes,
extract(second from CURRENT_TIMESTAMP - '2021-01-01 00:00:00')as seconds;
为避免重复表达式,您可以使用 common table expression:
with input (duration) as (
values (CURRENT_TIMESTAMP - '2021-01-01 00:00:00')
)
select duration::text as str,
extract(day from duration) as days,
extract(hour from duration) as hours,
extract(minute from duration) as minutes,
extract(second from duration) as seconds
from input;
你不能从间隔中得到“周”,但你可以使用 justify_interval()
来转换天数 to months