返回整个昨天而不是过去24小时的结果

时间:2015-02-18 20:31:24

标签: sql postgresql

我有这个需要昨天数据的查询。我在下面的内容返回过去24小时的结果,这与昨天00.00 - 23.59不同。 这是我的,但没有解决问题。

Select * from message where now() - arrival_timestamp <= interval '24 hour'

4 个答案:

答案 0 :(得分:3)

您可以使用语法timestampdate强制转换为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