问题描述
我有一个日期时间列,我必须创建一个新列,它将为我提供 5 分钟的日期和时间间隔。 (它是一个 Netezza 平台)
Transaction Time Interval - 5 Min(Expected Output)
2/1/2021 8:46 8:45:00 AM
2/1/2021 8:46 8:45:00 AM
2/1/2021 8:46 8:45:00 AM
2/1/2021 8:46 8:45:00 AM
2/1/2021 8:46 8:45:00 AM
2/1/2021 8:46 8:45:00 AM
2/1/2021 9:24 9:20:00 AM
2/1/2021 9:24 9:20:00 AM
2/1/2021 9:24 9:20:00 AM
2/1/2021 9:24 9:20:00 AM
2/1/2021 9:24 9:20:00 AM
2/1/2021 9:24 9:20:00 AM
2/1/2021 9:24 9:20:00 AM
2/1/2021 9:24 9:20:00 AM
2/1/2021 11:40 11:40:00 AM
2/1/2021 12:54 12:50:00 PM
2/1/2021 13:03 1:00:00 PM
2/1/2021 13:28 1:25:00 PM
2/1/2021 14:15 2:15:00 PM
2/1/2021 14:26 2:25:00 PM
2/1/2021 14:26 2:25:00 PM
2/1/2021 14:51 2:50:00 PM
2/1/2021 15:28 3:25:00 PM
2/1/2021 15:28 3:25:00 PM
解决方法
这是使用 mod
select
transaction_time
to_char(
transaction_time - interval '1 min' * mod(
date_part('minute',transaction_time),5),'HH:MI:SS AM')
as "5 min boundary" from tab;
TRANSACTION_TIME | 5 min boundary
---------------------+----------------
2021-02-01 08:46:00 | 08:45:00 AM
2021-02-01 08:46:00 | 08:45:00 AM
2021-02-01 08:46:00 | 08:45:00 AM
2021-02-01 08:46:00 | 08:45:00 AM
2021-02-01 08:46:00 | 08:45:00 AM
2021-02-01 08:46:00 | 08:45:00 AM
2021-02-01 09:24:00 | 09:20:00 AM
2021-02-01 09:24:00 | 09:20:00 AM
2021-02-01 09:24:00 | 09:20:00 AM
2021-02-01 09:24:00 | 09:20:00 AM
2021-02-01 09:24:00 | 09:20:00 AM
2021-02-01 09:24:00 | 09:20:00 AM
2021-02-01 09:24:00 | 09:20:00 AM
2021-02-01 09:24:00 | 09:20:00 AM
2021-02-01 11:40:00 | 11:40:00 AM
2021-02-01 12:54:00 | 12:50:00 PM
2021-02-01 13:03:00 | 01:00:00 PM
2021-02-01 13:28:00 | 01:25:00 PM
2021-02-01 14:15:00 | 02:15:00 PM
2021-02-01 14:26:00 | 02:25:00 PM
(20 rows)
,
一种常用的方法如下:
- 将日期/时间转换为纪元时间(自 1970-01-01 以来的秒数)。
- 四舍五入为五分钟(算术)。
- 转换回时间戳。
代码其实没有那么复杂:
select to_timestamp(floor(extract(epoch from transaction_time) / (5*60)) * 5*60 )
,
select to_char(YOUR_COL,'HH:' || extract(minutes from YOUR_COL) / 5 * 5 || ' AM');