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点
答案 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)。