我正在编写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?
答案 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位数字代表一年中的日期)。虽然你提到你正在使用看似正确的解释方式转换字符串,但我认为这可能是问题的根源(或者至少可以解释差异......)。