Oracle日期格式 - 奇怪的行为

时间:2009-09-11 07:03:20

标签: sql oracle9i

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

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

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

第一次输入我没有得到任何结果。当我把它改成第二个时,我得到了结果。 01 / OCT / 2009&amp; 1 / OCT / 2009?

2 个答案:

答案 0 :(得分:3)

比较日期时,您应始终明确地将运算符的两侧转换为DATE数据类型。假设StartDate和EndDate都是DATE数据类型,这将起作用:

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

在您的情况下,您得到的结果与VARCHAR比较一致。你正在比较字符串,你很可能得到正确的结果(因为月份不按字母顺序排序)。

如果StartDate和EndDate确实是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。

答案 1 :(得分:0)

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