首页 > 解决方案 > 选择过去一小时的数据

问题描述

我有一个简单的数据库

id    name      value    date          time
1     box       34       2020-06-08    14:45:00
2     box       35       2020-06-08    15:00:00
3     box       4        2020-06-08    15:15:00
4     box       44       2020-06-08    15:30:00
5     box       42       2020-06-08    15:45:00
6     box       41       2020-06-08    16:00:00
7     box       0        2020-06-08    16:15:00
8     box       0        2020-06-08    16:30:00
9     box       0        2020-06-08    16:45:00
...

我正在尝试从 Postgresql 数据库中检索过去 1 小时的最新数据。目标是每小时运行一次此查询,以获取过去一小时的数据,以便在另一个软件中进行进一步处理。

数据库中的记录已经包含当天的所有时间戳(间隔 15 分钟)。

因此,从示例中,假设我的当地时间是 16:00:00,我将希望从我的当地时间获取过去 1 小时的数据。

我尝试了以下方法:

SELECT id, name, value, date, time
FROM boxbox 
WHERE time >= (NOW() - INTERVAL '1 hour') 
ORDER BY time desc

但是我收到了这个 SQL 错误

SQL Error [42883]: ERROR: operator does not exist: time without time zone >= 
timestamp with time zone

表数据类型如下:

id - int4
name - varchar
value - int
date - date
time - time

谢谢你。

标签: postgresqlselecttime

解决方案


好吧,now()返回一个timestamp with time zone,而不是一个time值。而且您无法将time值与timestamp with time zone值进行比较。

您需要使用localtime

SELECT id, name, value, "date", "time"
FROM boxbox 
WHERE "time" >= localtime - INTERVAL '1 hour'
ORDER BY "time" desc

但是,如果时间超过午夜,上述操作将无法正常工作。如果您还需要注意这一点,则需要将您的datetime列合并为一timestamp列:

SELECT id, name, value, "date", "time"
FROM boxbox 
WHERE "date" + "time" >= now () - INTERVAL '1 hour'
ORDER BY "time" desc

推荐阅读