2

我正在编写一个 SQL 查询来从两个日期之间的表中检索数据。如图所示,我给出了两个输入。我转换 Date 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 和 1/OCT/2009 和有什么区别?

4

2 回答 2

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。

于 2009-09-11T08:37:57.627 回答
0

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

于 2009-09-11T08:06:14.330 回答