WITH
-- your input
input( xxx_2019 ) AS (
SELECT 234
UNION ALL SELECT 2142
UNION ALL SELECT 1423
UNION ALL SELECT 4634
UNION ALL SELECT 7886
UNION ALL SELECT 3143
UNION ALL SELECT 3243
)
--以分钟为间隔
,
with_interval AS (
SELECT
xxx_2019
, (xxx_2019::char(8)||' minutes')::INTERVAL as dircast
FROM input
)
--最后,从间隔中提取位,并格式化它们
SELECT
dircast
, REGEXP_REPLACE(
CASE EXTRACT(DAY FROM dircast)
WHEN 0 THEN ''
ELSE ', '||EXTRACT(DAY FROM dircast)::VARCHAR(5)||' days'
END
|| CASE EXTRACT(HOUR FROM dircast)
WHEN 0 THEN ''
ELSE ', '||EXTRACT(HOUR FROM dircast)::VARCHAR(5)||' hours'
END
|| CASE EXTRACT(MIN FROM dircast)
WHEN 0 THEN ''
ELSE ', '||EXTRACT(MIN FROM dircast)::VARCHAR(5)||' minutes'
END
, '^, ','') AS s
FROM with_interval
-- out dircast | s
-- out ---------+------------------------------
-- out 03:54 | 3 hours, 54 minutes
-- out 1 11:42 | 1 days, 11 hours, 42 minutes
-- out 23:43 | 23 hours, 43 minutes
-- out 3 05:14 | 3 days, 5 hours, 14 minutes
-- out 5 11:26 | 5 days, 11 hours, 26 minutes
-- out 2 04:23 | 2 days, 4 hours, 23 minutes
-- out 2 06:03 | 2 days, 6 hours, 3 minutes
当然,您可以直接,例如:
EXTRACT(DAY FROM (xxx_2019::char(8)||' minutes')::INTERVAL)
2条答案
按热度按时间rt4zxlrg1#
你可以直接这么做。像这样:
这是一把db<>小提琴(使用postgres)。
mefy6pfw2#
让vertica帮你做重活。
从分钟数中提取一个间隔,然后从间隔中提取天、小时和分钟,并将它们转换为逗号、计数器和单位,将所有字符串联起来,然后删除初始逗号:
--以分钟为间隔
--最后,从间隔中提取位,并格式化它们
当然,您可以直接,例如:
但我发现从另一个Angular 看它更具可读性。。。
当然,您可以使用@gordon linoff的方法,但是我会使用vertica中的整数除法操作符,即双斜杠
//
,而不是FLOOR()
-在除法之后,只需保持整数运算,这比浮点运算快得多。而让我迂腐的头脑不安的是,将整数隐式转换为字符,然后用字符串连接起来。。。