Oracle SQL:比较时间戳中的提取日期

时间:2016-11-08 07:45:35

标签: sql oracle

我有以下TABLE.Sample1

Col1(varchar) | Col2(timestamp) 
---------------------------------------
A             | 08-NOV-16 09.59.52.000000000 AM
B             | 08-NOV-16 10.05.12.000000000 AM
C             | 09-NOV-16 10.05.12.000000000 AM

假设我希望以DD MON YYYY

的格式获取给定日期的所有行

这是我的初步查询:

SELECT * 
  FROM Sample1 
 WHERE CAST(Col2 as DATE) = TO_DATE('8 NOV 2016','DD MON YYYY');

我很好奇为什么这个查询不能在平等(=)上工作,但在不等式(><,{{1 },<=>=)。我不是在这里比较相同的数据类型吗?

我最终使用<>函数来完成这项工作,但它引出了一个问题,是否有更简单或更直接的方法?

TO_CHAR

1 个答案:

答案 0 :(得分:1)

在Oracle中,DATE值仍然有时间。 CAST(Col2 as DATE)不会改变这一点。

您可以使用trunc()date(或timestamp)的时间部分设置为00:00:00,您不应该比较字符串,而是日期:

SELECT * 
FROM Sample1 
WHERE trunc(col2) = TO_DATE('8 NOV 2016','DD MON YYYY');

但我强烈建议使用这样的日期格式。它取决于SQL 客户端程序的NLS设置,并且可能因语言设置不同而失败。

我更喜欢使用ANSI SQL日期文字:

SELECT * 
FROM Sample1 
WHERE trunc(col2) = DATE '2016-11-08';

在这两种情况下,日期的时间都为00:00:00,因为没有给出,因此比较可行。

请注意,trunc(col2)将无法使用col2上的索引。如果性能很重要,您应该使用范围查询where col2 >= DATE '2016-11-08' and col2 < DATE '2016-11-09'或在trunc(col2)上创建基于函数的索引。