我有一个带有列时间戳的源tbl(DD.MM.YYYY HH24:MI:SS)
现在我想在01.11.2013和05.11.2013之间加载数据。
当我使用时,即:
从tbl中选择count(1),其中a.timestamp介于trunc(to_date('1.11.2013','DD.MM.YYYY'))之间 AND trunc(to_date('05 .11.2013','DD.MM.YYYY'))
因此输出为312.020
当通过DD.MM.YYYY进行选择计数和分组时,这些天的总数高于上面的查询。可能是什么原因。
答案 0 :(得分:1)
这有点难以辨别,但似乎你丢失了5日的部分或全部数据,因为你忽略了时间部分。当你这样做时:
a.timestamp between to_date('1.11.2013', 'DD.MM.YYYY')
AND to_date('05.11.2013', 'DD.MM.YYYY')
(我已删除了trunc()
,因为它们没有添加任何内容),您从01.11.2013 00:00:00
到05.11.2013 00:00:00
,不是计算到05.11.2013 23:59:59
这可能是你所期待的。
您可以与trunc(timestamp)
进行比较,但这可能会影响性能。你可以这样做:
a.timestamp between to_date('1.11.2013 00:00:00', 'DD.MM.YYYY HH24:MI:SS')
AND to_date('05.11.2013 23:59:59', 'DD.MM.YYYY HH24:MI:SS')
......或:
a.timestamp >= to_date('1.11.2013', 'DD.MM.YYYY')
AND a.timestamp < to_date('06.11.2013', 'DD.MM.YYYY')
注意到第二个版本中的“到”日期现在是第6个,所以它会达到但不会超过第5个结尾。
我从描述中假设您的字段属于DATE
类型;调用它timestamp
有点令人困惑,因为还有TIMESTAMP
数据类型。如果它实际上是TIMESTAMP
,那么第二个版本仍然可以使用,但第一个版本需要考虑小数秒并上升到23:59:59.999999999
,两者都应该使用to_timestamp()
致电而不是to_date()
。
a.timestamp between to_timestamp('1.11.2013 00:00:00', 'DD.MM.YYYY HH24:MI:SS')
AND to_timestamp('05.11.2013 23:59:59.999999999', 'DD.MM.YYYY HH24:MI:SS.FF9')
根据时间戳字段的精确度,您可能不需要所有9,并且可能使用FF3
或FF6
。更多信息the docs。