将分钟列转换为天、小时和分钟sql

vc9ivgsu  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(571)

我有一个这样的专栏-

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。

rt4zxlrg

rt4zxlrg1#

你可以直接这么做。像这样:

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);

这是一把db<>小提琴(使用postgres)。

mefy6pfw

mefy6pfw2#

让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)

但我发现从另一个Angular 看它更具可读性。。。
当然,您可以使用@gordon linoff的方法,但是我会使用vertica中的整数除法操作符,即双斜杠 // ,而不是 FLOOR() -在除法之后,只需保持整数运算,这比浮点运算快得多。而让我迂腐的头脑不安的是,将整数隐式转换为字符,然后用字符串连接起来。。。

SELECT
  TRIM(LEADING ', ' FROM
     CASE
       WHEN XXX_2019 > 24*60
       THEN ', ' || ( XXX_2019 // (24*60) )::VARCHAR(5)|| ' days'
       ELSE ''
     END
   ||CASE
       WHEN XXX_2019 > 60
       THEN ', ' || ( (XXX_2019 % (24*60)) // 60 )::VARCHAR(5)|| ' hours'
       ELSE ''
     END
   ||', ' || (xxx_2019 % 60) ::VARCHAR(5)|| ' minutes'
  )                                                                         
FROM input;

相关问题