仅选择今天(从午夜开始)时间戳

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)

希望有所帮助.


Sui*_*sse 9

select * from termin where DATE(dateTimeField) >= CURRENT_DATE AND DATE(dateTimeField) < CURRENT_DATE + INTERVAL '1 DAY'
Run Code Online (Sandbox Code Playgroud)

这适用于我 - 它选择今天日期的所有行.

  • 为什么不从DATE(dateTimeField)= CURRENT_DATE的termin中选择*? (2认同)

小智 8

select * from termin where DATE(dateTimeField) = '2015-11-17'
Run Code Online (Sandbox Code Playgroud)

这对我很有用!