将分钟列转换为天、小时和分钟 SQL
Converting Minutes Column to Days, Hours and Minutes SQL
我有一个这样的专栏-
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。
您可以直接执行此操作。像这样:
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<>fiddle(使用 Postgres)。
让 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 中的整数除法运算符,即双斜杠 //
,而不是 FLOOR()
- 之后进行除法 - 只是为了保持整数算术,这比浮点算术快得多。令我迂腐的头脑不安的是将 INTEGER 隐式转换为字符,然后将其与字符串连接 ...
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;
我有一个这样的专栏-
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。
您可以直接执行此操作。像这样:
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<>fiddle(使用 Postgres)。
让 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 中的整数除法运算符,即双斜杠 //
,而不是 FLOOR()
- 之后进行除法 - 只是为了保持整数算术,这比浮点算术快得多。令我迂腐的头脑不安的是将 INTEGER 隐式转换为字符,然后将其与字符串连接 ...
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;