Oracle日期比较为字符串和日期

时间:2015-09-16 18:33:28

标签: oracle

1)为什么这不起作用

select * from table where trunc(field1)=to_date('25-AUG-15','DD-MON-YY');

select * from table where trunc(field1)=to_date('25/Aug/15','DD/MON/YY');
在上述情况下返回

行。

那么,这是否意味着无论field1中的日期是什么格式,如果它是有效日期并且与8月25日匹配,它将被返回(它将不关心我们在右边指定的格式说明符)查询的一侧,即DD-MON-YY或DD / MON / YY或其他任何东西)?

2)但是字符串的比较完全有效:

select * from table where to_char(field1)=to_char(to_date     

('25/AUG/15','DD/MON/YY'), 'DD/MON/YY');

没有返回任何行,因为完全执行了比较。

我将field1设为'25 -AUG-15'(虽然可以通过不同的方式查看更改会话NLS_DATE_FORMAT ...)

field1属于DATE类型

有关理解这一点的任何帮助都特别赞赏第1点

2 个答案:

答案 0 :(得分:3)

DATE数据类型没有格式 - 它只是一个数字。因此,DATE 2015年8月25日与DATE 25 / AUG / 15以及DATE 2015-08-15相同,因为它是相同的DATE

另一方面,字符串是字符集合,因此'25-Aug-2015'明显不同于'25/AUG/15'

在第一个示例中,您要比较DATE个值。在第二个示例中,您正在比较字符串。

答案 1 :(得分:2)

所以你有一个类型为 DATE 的字段,其值为 2015年8月25日, 但它可以用不同的方式可视化,实际上命名为格式。

DATE 有格式! DATE 具有由Oracle定义的隐式格式,在您的情况下是DD-MON-YY,因为您将字段视为25-AUG-15。

您可以选择没有 TO_DATE 转换的数据,只需匹配此默认格式,如下所示:

select * from table where trunc(field1)='25-AUG-15';

事实上,不建议这样做,因为如果有人更改默认格式,Oracle将无法理解您将告诉他 DATE

在这种情况下, to_date 转换:

  

从表格中选择*   TRUNC(FIELD1)= TO_DATE('25 / AUG / 15' , 'DD / MON / YY');

用于指定您想要使用不同格式(指定为第二个参数)告诉Oracle DATE 类型,其值 2015年8月25日。 (在这种情况下为DD / MM / YY)。