PostgreSQL中。与明确定义WHERE子句中的整个时间戳相比,将时间戳转换为日期的区别

时间:2017-07-21 15:44:38

标签: postgresql date casting where

我有一个带有两个WHERE子句版本的SQL查询:

第一个(显式时间戳):

WHERE created_at BETWEEN '2017-07-06 00:00:00.0' AND '2017-07-20 00:00:00.0' AND doc->>'sensorId' != '7777777'

产生的行数= 15477

第二(演员日期):

WHERE created_at::date BETWEEN '2017-07-06'::date AND '2017-07-20'::date AND doc->>'sensorId' != '7777777'

结果行数= 18679

created_at列包含时间戳,没有时区,格式为“2017-07-06 08:41:34.574686”

毫秒的长度在5到6位之间不等。

我意识到这很可能是通过将时间戳作为日期来创建的,但我不知道为什么会发生这种情况,如果有人可以解释的话。

3 个答案:

答案 0 :(得分:2)

我是个白痴......第一个问题应该是AND'2017-07-21 00:00:00.0'

答案 1 :(得分:0)

当你使用timepstamp时

BETWEEN '2017-07-06 00:00:00.0' AND '2017-07-20 00:00:00.0'

这意味着在2017-07-20 00:00:00.0'之后的每个活动(例如' 2017-07-20 12:15:11')超出范围。

您应该使用' 2017-07-21 00:00:00.0'时间戳。

答案 2 :(得分:0)

答案已经给出,但我会尝试给出更详细的解释。

假设您在2017-07-20 12:34:56列中有一行created_at

在第二个查询中,您将从列值中截断时间(小时,分钟等):

WHERE created_at::date ...

所以2017-07-20 12:34:56转换为2017-07-20BETWEEN条件符合('2017-07-20' <= '2017-07-20'::date为TRUE),此行将被删除。

在第一个查询中,您按原样created_at,然后将其与'2017-07-20 00:00:00.0'中的BETWEEN进行比较,以便第一个查询不会占用我们的行(因为{{ 1}}为FALSE)。

这就是为什么第二个查询返回的行多于第一个查询的原因。