2015-09-16 46 views
0

1),这是为什么,这并不工作Oracle日期比较的字符串和日期

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),但作为comparsion字符串完全工作:如进行准确的比较返回

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

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

没有行。

我已经FIELD1为'25 -AUG-15' (尽管它可以被看作做不同的ALTER会议NLS_DATE_FORMAT ...)

FIELD1是DATE类型

的理解这个任何帮助表示赞赏特别是关于点1

+0

所以打印出to_char函数的值,看看它们是什么。你想做什么? – OldProgrammer

+0

如果您在第一次投射中指定相同的格式,第二个查询的行为是否相同? 'to_char(field1,'DD/MON/YY')' –

+0

我的观点是,为什么第一种情况下返回的结果不考虑格式说明符,即它只返回8月25日的结果,但它并不关心日期格式 – user1502952

回答

3

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

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

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

+0

谢谢,为了明确的解释 – user1502952

2

所以,你有型日期的场 2015年8月,第25次价值,但它可能以不同的方式,其实什么被命名为格式进行可视化。

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

您可以选择您的数据,而无需TO_DATE转换,只是匹配这个默认格式这样的:

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

事实上,它是不推荐的,因为如果有人将更改默认的格式,Oracle会不能理解你要告诉他一个日期

所以TO_DATE转换在这种情况下:

SELECT * FROM表,其中 TRUNC(FIELD1)= TO_DATE('25/AUG/15' , 'DD/MON/YY');

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

+0

谢谢,只是为了增加这一点,你能帮助,为什么这两个工作select * from table where trunc(field1)= to_date('25 -AUG-15','DD-MON-YY ')并从表中选择* trunc(field1)= to_date('25 -AUG-15','DD-Mon-YY');因为我相信第二个查询输入25-Aug-15应该只能工作 – user1502952

+0

因为你指定**相同的**值,只是使用不同的格式,这两种情况下oracle的内部格式无关紧要你指定**日期** 2015年8月25日。 –

+0

是的,这是正确的,但格式有效的25-AUG-15是'DD-MON-YY',而不是'DD-MON-YY'(这是为25-Aug-15),这不是格式版本在这里重要吗?例如:我不能使用to_date('25 -AUG-15','MMDDYY'),因为这会抛出错误 – user1502952