Select today's (since midnight) timestamps only
我有一个PostgreSQL 8.4的服务器,每天晚上01:00(不要问)重新启动,需要获得一个连接用户列表(即他们的时间戳是
1 2 3 4 5 6 7 8 9 10 11 | SELECT u.login, u.id, u.first_name FROM pref_users u WHERE u.login > u.logout AND u.login > now() - INTERVAL '24 hour' ORDER BY u.login; login | id | first_name ----------------------------+----------------+------------- 2012-03-14 09:27:33.41645 | OK171511218029 | Alice 2012-03-14 09:51:46.387244 | OK448670789462 | Bob 2012-03-14 09:52:36.738625 | OK5088512947 | Sergej |
但是比较
从上一次01:00开始,有没有什么有效的方法可以不用使用
受到@frank评论的启发,我进行了一些测试,并相应地修改了我的查询。这应该是1)正确和2)尽快:
1 2 3 4 5 | SELECT u.login, u.id, u.first_name FROM pref_users u WHERE u.login > u.logout AND u.login >= now()::DATE + INTERVAL '1h' ORDER BY u.login; |
因为您的表中没有未来的时间戳(我假设),所以您不需要上界。
以下表达式的执行方式略有不同。由于
最好的五。使用PostgreSQL 9.0进行测试。重复9.1.5:1%误差范围内结果一致。
1 2 3 4 5 | SELECT localtimestamp::DATE + INTERVAL '1h' -- Total runtime: 351.688 ms , CURRENT_DATE + INTERVAL '1h' -- Total runtime: 338.975 ms , date_trunc('day', now()) + INTERVAL '1h' -- Total runtime: 333.032 ms , now()::DATE + INTERVAL '1h' -- Total runtime: 278.269 ms FROM generate_series (1, 100000) |
从01:00开始只获取当天时间戳的一个简单方法是过滤
所以您的查询应该如下所示:
1 2 3 4 5 | SELECT u.login, u.id, u.first_name FROM pref_users u WHERE u.login > u.logout AND u.login > CURRENT_DATE + INTERVAL '1 hour' ORDER BY u.login; |
希望有帮助。
1 | SELECT * FROM termin WHERE DATE(dateTimeField) >= CURRENT_DATE AND DATE(dateTimeField) < CURRENT_DATE + INTERVAL '1 DAY' |
这对我有效-它选择所有具有今天日期的行。
1 | SELECT * FROM termin WHERE DATE(dateTimeField) = '2015-11-17' |
这对我很管用!
1 2 3 4 5 6 | WHERE u.login > u.logout AND date_trunc('day', u.login) = date_trunc('day', now()) AND date_trunc('hour', u.login) >= 1 |