我有以下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
答案 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)
上创建基于函数的索引。