我有这个需要昨天数据的查询。我在下面的内容返回过去24小时的结果,这与昨天00.00 - 23.59不同。 这是我的,但没有解决问题。
Select * from message where now() - arrival_timestamp <= interval '24 hour'
答案 0 :(得分:3)
您可以使用语法timestamp
将date
强制转换为expression::type
(有关PostgreSQL文档的The Type Casts section的更多信息)。可以在9.9. Date/Time Functions and Operators:
SELECT * FROM message WHERE arrival_timestamp::date = current_date - 1;
如果您在arrival_timestamp
上有索引,则迄今为止的转换会使索引在查询中无法使用。在这种情况下,使用其他比较运算符:
SELECT * FROM message WHERE arrival_timestamp >= current_date - 1 AND arrival_timestamp < current_date;
答案 1 :(得分:0)
你可以试试这个:
SELECT * FROM message
WHERE date_trunc('day', arrival_timestamp) = current_date - interval '1 day'
答案 2 :(得分:0)
使用时间或任何其他数据类型时,您希望避免使用
形式的过滤条件function( field ) comparison other_field_or_constant
这是不可鄙视的。这意味着如果field
被编入索引,优化器就无法利用。由于它无法预测函数调用将产生什么值,因此它必须执行完整的表扫描并将每个field
值提交给函数进行比较。
所以你希望where
子句中的每个表达式都是
field comparison other_field_or_constant
请注意function( constant )
仍然是一个常量,因为所有这些结果都被缓存并重新用于每次比较,而不是为每次比较调用的函数。
在你的情况下,这里,伪代码,是你想要做的。你想要yesterday
。很好,我所知道的每个DBMS都有一个返回Now
的系统函数。昨天是Now
前一天的午夜,但不包括Now
的午夜。
where arrival_timestamp >= trunc( now ) - 1 day
and arrival_timestamp < trunc( now );
将上面的表达式翻译成英语是:“值是在昨天早上午夜或之后的任何时间,但不包括午夜的任何时间。”换句话说,“昨天”。通过这种方式执行比较,您不必担心系统时钟可以生成时间戳的午夜时间。只要时间点击到最后一夜午夜,无论点击量有多大或极小,比较都会产生有效结果。
注意,arrival_timestamp
没有进行任何操作,甚至没有将其转换为更方便的数据类型。表达式trunc( now )
(包括减去一天的表达式)是常量。这些函数被调用一次,结果反复使用每一行。这就是为什么所有这些功能必须是确定性的。即使是事实上不具有确定性的函数,如Now
,也被认为是查询生命的确定性。
因此,您可以在比较的右侧做任何您需要做的事情。例如,因为SQL Server没有trunc函数,所以上面写的第一行看起来像这样:
where arrival_timestamp >= DateAdd( day, -1, DateAdd( day, DateDiff( day, 0, GetDate()), 0))
没关系。计算执行一次,结果用于查询的整个持续时间。
所以where
子句现在可以看作是
where field >= constant1
and field < constant2;
这意味着如果索引field
,则现在可以使用该索引。
答案 3 :(得分:-2)
您可以使用DATE_PART功能
select * from message where DATE_PART('day', now() - arrival_timestamp) <= 1