将“分钟”列转换为“天,小时和分钟” SQL

时间:2020-08-07 22:31:47

标签: sql vertica

我有一列这样的内容-

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。

2 个答案:

答案 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()