Ale*_*ber 37 postgresql datetime timestamp date postgresql-8.4
我有一个PostgreSQL 8.4服务器,每天晚上01:00重新启动(不要问),需要获取连接用户列表(即他们的时间戳u.login > u.logout):
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
Run Code Online (Sandbox Code Playgroud)
但是比较u.login > now()-interval '24 hour'也会在最后01:00之前提供用户,这很糟糕,尤其是.在早上.
是否有任何有效的方法来获取自上次01:00以来没有使用字符串杂技的登录to_char()?
Erw*_*ter 52
在@ Frank的评论的启发下,我运行了一些测试并相应地调整了我的查询.这应该是1)正确和2)尽可能快:
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;
Run Code Online (Sandbox Code Playgroud)
由于您的表中没有未来的时间戳(我假设),您不需要上限.
date_trunc('day', now())几乎与now()::date(或下面详述的其他一些替代方案)相同,只是它返回timestamp而不是a date.无论导致timestamp反正添加之后interval.
下面的表达式略有不同.他们产生微妙的不同的结果,因为localtimestamp返回的数据类型timestamp,而now()回报timestamp with time zone.但是当date转换为时,要么转换为相同的本地日期,要么timestamp [without time zone]假定a 也在本地时区.因此,与相应的相比,timestamp with time zone它们都会在内部产生相同的UTC时间戳.有关此相关问题的时区处理的更多详细信息.
最好的五个.使用PostgreSQL 9.0进行测试.重复9.1.5:1%误差范围内的一致结果.
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)
Run Code Online (Sandbox Code Playgroud)
now()::date显然略快于CURRENT_DATE.
Fra*_*ack 12
从01:00开始只获取当天的时间戳的简单方法是过滤
CURRENT_DATE + interval '1 hour'
所以你的查询应该是这样的:
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;
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.
select * from termin where DATE(dateTimeField) >= CURRENT_DATE AND DATE(dateTimeField) < CURRENT_DATE + INTERVAL '1 DAY'
Run Code Online (Sandbox Code Playgroud)
这适用于我 - 它选择今天日期的所有行.
小智 8
select * from termin where DATE(dateTimeField) = '2015-11-17'
Run Code Online (Sandbox Code Playgroud)
这对我很有用!
| 归档时间: |
|
| 查看次数: |
44308 次 |
| 最近记录: |