我有一个带有两个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位之间不等。
我意识到这很可能是通过将时间戳作为日期来创建的,但我不知道为什么会发生这种情况,如果有人可以解释的话。
答案 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-20
和BETWEEN
条件符合('2017-07-20' <= '2017-07-20'::date
为TRUE),此行将被删除。
在第一个查询中,您按原样created_at
,然后将其与'2017-07-20 00:00:00.0'
中的BETWEEN
进行比较,以便第一个查询不会占用我们的行(因为{{ 1}}为FALSE)。
这就是为什么第二个查询返回的行多于第一个查询的原因。