在 postgresql 中将一天的列表,H-M-S 转换为小时格式

Convert a list in day,H-M-S to Hour format in postgresql

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

为每个产品 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

好的,如下:

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)