从半小时间隔时间提取小时数为1-48

时间:2014-04-18 05:24:51

标签: sql database postgresql date-arithmetic

我有以下数据。

0:00:00
0:30:00
1:00:00
1:30:00
2:00:00
2:30:00
3:00:00
3:30:00
4:00:00
4:30:00
5:00:00
5:30:00
6:00:00
6:30:00

我可以使用EXTRACT(HOUR FROM TIMESTAMP)提取小时,但这会给我24小时。

但现在我需要进行一些不同的计算,我可以根据给定的时间从1-48获取数字。

这样的事情:

0:00:00 1
0:30:00 2
1:00:00 3
1:30:00 4
2:00:00 5
2:30:00 6
3:00:00 7
3:30:00 8
4:00:00 9
4:30:00 10
6:00:00 13
6:30:00 14

请注意跳过的11和12,缺席值为5:00和5:30。

我是否有可能在PostgreSQL中获得该结果?

3 个答案:

答案 0 :(得分:4)

只需使用公式 1 + extract(hour from 2 * tm) - 它会准确地给出您的预期结果 - 必须SQLFiddle

答案 1 :(得分:2)

这将为您提供double precision结果,您可以将其舍入为您想要的任何内容:

2 * (EXTRACT(HOUR FROM t) + EXTRACT(MINUTE FROM t) / 60) + 1

修改

或者,正如@CraigRinger所说:

EXTRACT(EPOCH FROM t) / 1800 + 1

对于后者,t必须为TIME不是 TIMESTAMP。如果需要,请使用演员表 更新:这也适用于INTERVAL

SELECT 2 * (EXTRACT(HOUR FROM t) + EXTRACT(MINUTE FROM t) / 60) + 1,
       EXTRACT(EPOCH FROM t) / 1800 + 1
FROM (VALUES (time '4:30:00'), (time '7:24:31'), (time '8:15:00')) as foo(t)

-- results:

?column? | ?column?
---------+---------
10       | 10
15.8     | 15.8172222222222
17.5     | 17.5

但正如你所写,没有边缘情况(当时间不能分为30分钟时)。

答案 2 :(得分:-1)

select 
case 
when date_time_field_of_interest::time >= '00:00:00' and date_time_field_of_interest::time < '00:30:00' then 1 
when date_time_field_of_interest::time >= '00:30:00' and date_time_field_of_interest::time < '01:00:00' then 2  
....
end 
from your_table;