2009-09-11 96 views
2

我正在写一个SQL查询以从两个日期之间的表中检索数据。我给出了两个输入,如图所示。我转换日期TO_CHAR(DD/MON/YYYY)Oracle日期格式 - 奇怪的行为

1. StartDate > 01/SEP/2009 
    EndDate < 01/OCT/2009 

2. StartDate > 01/SEP/2009 
    EndDate < 1/OCT/2009 

我没有得到任何结果的第一个输入。当我将其更改为第二个时,我会得到结果。 01/OCT/2009 & 1/OCT/2009和有什么不一样?

回答

3

当比较日期时,您应该始终将操作符的双方明确转换为DATE数据类型。假设起始日期和结束日期均为DATE数据类型,这会工作:

StartDate > to_date('01/SEP/2009', 'dd/MON/yyyy') 
AND EndDate < to_date('01/OCT/2009', 'dd/MON/yyyy') 

你的情况,但是你得到的结果是VARCHAR比较一致。你正在比较字符串,它是非常不可能的,你会得到正确的结果(因为月份不按字母顺序排序)。

如果起始日期和结束日期确实是VARCHAR,你应该明确地它们转换:

to_date(StartDate, 'dd/MON/yyyy') > to_date('01/SEP/2009', 'dd/MON/yyyy') 
AND to_date(EndDate, 'dd/MON/yyyy') < to_date('01/OCT/2009', 'dd/MON/yyyy') 

这是有效的Oracle的所有版本。

0

由于我没有可用于验证我的答案的Oracle客户端,所以不确定,但是:在Oracle中,表示日期(D)的日期字符串中的单个数字用于指定星期几(星期一 - 星期日),而2位数字用于指定月份的日期(3位数字代表年份中的某一天)。虽然你提到你使用了正确的解释方式来转换字符串,但我认为这可能是问题的根源(或者至少可以解释不同之处)。