从表中加载时间戳之间的数据

时间:2013-12-11 14:29:25

标签: oracle oracle11g oracle10g

我有一个带有列时间戳的源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进行选择计数和分组时,这些天的总数高于上面的查询。可能是什么原因。

1 个答案:

答案 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:0005.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,并且可能使用FF3FF6。更多信息the docs