【问题标题】:Search data using Timestamp datatype in Oracle Where clause在 Oracle Where 子句中使用 Timestamp 数据类型搜索数据
【发布时间】:2016-03-06 10:05:08
【问题描述】:

我有表 Alert_Logs,其中有 2 列 KPI_DEF_IDTIMESTAMPTIMESTAMP 列属于 timestamp 数据类型。我想使用 oracle sql where 子句中的时间戳列搜索数据。我尝试了下面的查询,但它什么也没返回。

Select * from ALERT_LOGS WHERE KPI_DEF_ID = 1000571 and TIMESTAMP = to_timestamp('17.10.15 00:02:58','DD.MM.YY HH24:MI:SS');

【问题讨论】:

  • 这意味着没有具有该时间戳和 kpi_def_id 的行。为什么你认为它有问题?

标签: sql oracle datetime timestamp


【解决方案1】:

和 TIMESTAMP = to_timestamp('17.10.15 00:02:58','DD.MM.YY HH24:MI:SS')

由于您的列数据类型是 timestamp,它的元素将比 datetime 多。

另外,相等条件 不匹配任何行。您需要使用范围条件

例如,要获取时间戳在2 AM3 AM 之间的所有行:

WHERE TIMESTAMP >= to_timestamp('17.10.15 00:02:00','DD.MM.YY HH24:MI:SS')
AND   TIMESTAMP <  to_timestamp('17.10.15 00:03:00','DD.MM.YY HH24:MI:SS')

使用范围条件的好处是它在性能方面会高效。使用 TO_CHAR 会抑制 timestamp 列 上的任何常规 index。范围条件将执行索引范围扫描

【讨论】:

  • 你能告诉我 lalit 如何使用范围条件吗?而且你是正确的 lalit 相等条件不匹配行。
  • @Rahul 请参阅答案中的示例。
  • @Rahul 你的意思是你不希望行与那个确切的时间戳匹配?并返回所有其他行?
  • @Rahul 是的,只需使用 &lt;&gt;!=
【解决方案2】:

您正在尝试将时间戳与日期进行比较。时间戳也有毫秒。假设 TIMESTAMP 是时间戳类型,这可能会起作用

Select * from ALERT_LOGS WHERE KPI_DEF_ID = 1000571 and to_char(TIMESTAMP, 'DD.MM.YY HH24:MI:SS') = '17.10.15 00:02:58';  

这就是时间戳的表示方式。

SQL> select to_timestamp('02.12.15 08:40:54', 'DD.MM.YY HH24:MI:SS') from dual;

TO_TIMESTAMP('02.12.1508:40:54','DD.MM.YYHH24:MI:SS')

02-DEC-15 08.40.54.000000000 AM

【讨论】:

  • @DurgaViswanathGadiraju 不。这不是有效的解决方案。我不会这样做,因为它会降低性能。因为,使用 TO_CHAR 会抑制任何常规索引。最好的方法是使用我在回答中提到的范围条件。
  • @Lalit 好点。但如果 KPI_DEF_ID 上有索引,问题可能不大。在某些情况下,时间戳列上可能没有索引。
  • @DurgaViswanathGadiraju 大多数报告系统在时间戳列上都有索引,拥有时间戳列的全部意义在于根据时间线过滤行。
猜你喜欢
  • 1970-01-01
  • 2015-04-19
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 2016-04-05
  • 2019-10-04
  • 1970-01-01
相关资源
最近更新 更多