我有以下数据。
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中获得该结果?
答案 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;