首页 > 解决方案 > 在postgresql中将天,HMS中的列表转换为小时格式

问题描述

将我的整个列表(以天、小时-分钟-秒格式)转换为仅小时(整数),因为我需要计算新列表的中位数。

对于每个产品 ID,都会计算小时数。我只粘贴了一点我的清单。但是列表非常庞大,因此我无法对日期进行硬编码并找到所需的时间。相反,我想将我的整个列表转换为小时,因为我需要计算新列表的中位数。中位数仅采用一种数字格式。

SELECT 
    "FulfillmentHistories"."fulfillmentId", 
    (max("createdAt")-min("createdAt")) as "Range" 
FROM 
    "FulfillmentHistories" //takes the time difference between two dates
where 
    "currentState" IN ('created','delivered')
GROUP BY 
    "FulfillmentHistories"."fulfillmentId" 
HAVING COUNT("FulfillmentHistories"."createdAt")>1
ORDER BY "Range" DESC

这给了我两个日期戳之间的时间差异,因此结果给出了一个日、时-分-秒格式的列表。如图所示 在 postgresql 中需要一种格式的列表。请帮忙,谢谢!

    Range   

7 days, 4:30:56.324000

2 days, 18:26:25.955000

2 days, 16:38:25.600000

2 days, 15:01:34.488000

2 days, 11:37:27.956000

2 days, 8:15:20.769000

2 days, 6:59:28.396000

2 days, 5:13:47.411000

标签: postgresql-9.3redash

解决方案


好的,如下所示:

postgres=# select * from test_table ;
          range          
-------------------------
 7 days, 4:30:56.324000
 2 days, 18:26:25.955000
 2 days, 16:38:25.600000
 2 days, 15:01:34.488000
 2 days, 11:37:27.956000
 2 days, 8:15:20.769000
 2 days, 6:59:28.396000
 2 days, 5:13:47.411000
(8 rows)

postgres=# select                    
    range, 
    extract(hour from replace((string_to_array(range,','))[2],' ','')::time) + replace((string_to_array(range,','))[1],' days','')::int * 24 as total_hours
from
    test_table;
          range          | total_hours 
-------------------------+-------------
 7 days, 4:30:56.324000  |         172
 2 days, 18:26:25.955000 |          66
 2 days, 16:38:25.600000 |          64
 2 days, 15:01:34.488000 |          63
 2 days, 11:37:27.956000 |          59
 2 days, 8:15:20.769000  |          56
 2 days, 6:59:28.396000  |          54
 2 days, 5:13:47.411000  |          53
(8 rows)

推荐阅读