问题描述
我在 Postgresql 的 TimescaleDB 中工作。我有下表:
| id | timestamp |
----------------------------
| 1 | 2021-07-12 01:04:58 |
| 2 | 2021-07-12 02:12:03 |
| 3 | 2021-07-12 04:44:11 |
| 4 | 2021-07-12 05:08:31 |
我可以在一个查询中选择一小时桶中的时间,时间戳为timestamp_start,时间戳加一小时为timestamp_end,在一个查询中(意味着没有子查询)?
这就是我要找的结果:
| timestamp_start | timestamp_end |
---------------------------------------------
| 2021-07-12 01:00:00 | 2021-07-12 02:00:00 |
| 2021-07-12 02:00:00 | 2021-07-12 03:00:00 |
| 2021-07-12 03:00:00 | 2021-07-12 04:00:00 |
| 2021-07-12 04:00:00 | 2021-07-12 05:00:00 |
| 2021-07-12 05:00:00 | 2021-07-12 06:00:00 |
解决方法
使用date_trunc
,例如
SELECT
date_trunc('hour',tm) AS timstamp_start,date_trunc('hour',tm) + interval '1 hour' AS timstamp_end
FROM t;
timstamp_start | timstamp_end
---------------------+---------------------
2021-07-12 01:00:00 | 2021-07-12 02:00:00
2021-07-12 02:00:00 | 2021-07-12 03:00:00
2021-07-12 04:00:00 | 2021-07-12 05:00:00
2021-07-12 05:00:00 | 2021-07-12 06:00:00
(4 rows)
演示:db<>fiddle
它有效,您可以声明与date_trunc
相同:
tsdb=> select time_bucket('1 hour',time) as start,time_bucket('1 hour',time) + interval '1 hour' as end_date from conditions limit 1;
┌────────────────────────┬────────────────────────┐
│ start │ end_date │
├────────────────────────┼────────────────────────┤
│ 2010-01-06 22:00:00+00 │ 2010-01-06 23:00:00+00 │
└────────────────────────┴────────────────────────┘