使用to_date的Oracle日期比较不起作用

时间:2016-12-11 05:08:39

标签: oracle date

我在我的机器上使用Oracle XE 将表定义为:

Name       Type
ENAME      VARCHAR2(20) 
DOJ        DATE  

点击一个简单的选择:

  

从test1.tasty1;

中选择*
ENAME                DOJ
sat                  08-DEC-16 

好的 - 我知道DATE字段中有时间组件。
使用TRUNC的以下查询工作正常:

  

从test1.tasty1中选择*,其中trunc(DOJ)='08 -DEC-16';

现在我想测试'to_date'函数 - 但是以下查询都没有工作 - 想知道为什么?

  

从test1.tasty1中选择*,其中DOJ =   TO_DATE('08 -12-2016' , 'DD-MM-YYYY');
  从test1.tasty1中选择*   DOJ = to_date('08 -DEC-2016','DD-MON-YYYY');
  选择*来自   test1.tasty1其中DOJ = to_date('08 -DEC-16','DD-MON-YY');
  选择   *来自test1.tasty1,其中DOJ = to_date('08 -DEC-16','dd-mon-RR');

在SO上看了以下内容:
Oracle TO_DATE not working

所以不确定这里有什么问题?

2 个答案:

答案 0 :(得分:1)

您是否尝试过这样做,因为日期与日期的比较是正确的:

select * from test1.tasty1 where to_date(DOJ,'DD-MM-YYYY') = to_date('08-12-2016','DD-MM-YYYY');

比较苹果和苹果,而不是芒果。

答案 1 :(得分:0)

从您的问题和评论中看来,这是发生的事件序列。

您在表格中执行了以下INSERT

INSERT INTO test1.tasty1 VALUES ('sat', SYSDATE)

请记住,Oracle中的日期包含日期时间组件。因此,即使你确实插入了日期'2016-12-08',你插入了一个时间组件。因此,以下查询不会返回任何记录:

SELECT * FROM test1.tasty1 WHERE DOJ = '2016-08-12'

这可能是因为您从未指定过时间组件,因此您之前插入的记录不匹配。如果您只想比较日期部分,可以使用TRUNC,如下所示:

SELECT * FROM test1.tasty1 WHERE TRUNC(DOJ) = '2016-08-12'

如果您真的只想处理日期组件,那么向前推进的问题的解决方案是在插入期间用SYSDATE包裹TRUNC

顺便说一下,用作文字的格式'08-DEC-16'将不会被Oracle识别为有效日期。相反,请使用'2016-12-08'