我有一列这样的内容-
XXX_2019
234
2142
1423
4634
7886
3143
3243
我要输出
XXX_2019
3 hours, 54 minutes
1 days, 11 hours, 42 minutes
23 hours, 43 minutes
这不是日期时间。这只是一分钟的专栏。我正在使用Vertica。
答案 0 :(得分:1)
您可以直接执行此操作。像这样:
select trim(leading ', ' from
(case when XXX_2019 > 24*60 then ', ' || floor(xxx_2019 / (24*60)) || ' days' else '' end) ||
(case when XXX_2019 > 60 then ', ' || floor((xxx_2019 % (24*60)) / 60) || ' hours' else '' end) ||
(', ' || xxx_2019 % 60 || ' minutes')
)
from (values (12345), (123), (12)) v(xxx_2019);
Here是db <>小提琴(使用Postgres)。
答案 1 :(得分:1)
让Vertica为您完成繁重的工作。
从分钟计数中减去一个间隔,然后从该间隔中提取日,小时和分钟,并将它们转换为逗号,计数器和单位,将所有内容连接起来,然后删除初始逗号:
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)
但是我发现它更具可读性...
当然,您可以使用 @Gordon Linoff 的方法,但是随后我将在Vertica中使用整数除法运算符,即双斜杠//
,而不是{{1 }}-之后进行除法-只是要保持在整数算术之内,这比浮点算术要快得多。而困扰我的学究思想的是将INTEGER隐式转换为字符,然后将其与字符串连接起来……
FLOOR()