SQL BETWEEN无法正常工作

时间:2011-05-12 14:32:52

标签: sql oracle

我在oracle数据库上运行以下语句。

SELECT br.Number
  FROM Billing_History br 
 WHERE TRUNC(br.History_Date) BETWEEN to_date('01-Jan-99', 'DD-Mon-YY HH:MI:SS') 
                                  AND to_date('11-May-99', 'DD-Mon-YY HH:MI:SS')

该表中肯定有记录介于这些日期之间。并且他们都有一个与他们一起的数字,但由于某种原因,这不会返回任何数字。它根本没有任何回报。

数据库中的日期采用此格式' 01-Jan-11'。因此,似乎我也将日期设置为正确的格式。你看到我写的SQL有什么问题吗?

3 个答案:

答案 0 :(得分:11)

问题不在于格式模型的时间组件,而是“YY”组件,这意味着在您的年份转换为2099,而非1999年。请尝试此说明:

SQL> SELECT to_char(to_date('01-Apr-99','DD-Mon-YY'),'DD-Mon-YYYY') thedate
       FROM dual;

THEDATE
-----------
01-Apr-2099

SQL> 

使用20世纪日期时,使用RR或YYYY作为年份的格式模型组件。

编辑:

您发表声明“数据库中的日期采用此格式'01 -Jan-11'。”这是Oracle中日期的常见但不正确的解释。 DATE字段始终存储在同一internal format中。所有这些都是关于如何在转换函数中使用格式模型来指示数据如何转换为内部格式/从内部格式转换。

答案 1 :(得分:5)

以日期格式而不是YY使用RR。这可能是2099年而不是1999年。

SELECT br.Number FROM Billing_History br WHERE  
TRUNC(br.History_Date) BETWEEN to_date('01-Jan-99', 'DD-Mon-RR HH:MI:SS') 
AND to_date('11-May-99', 'DD-Mon-RR HH:MI:SS')

答案 2 :(得分:3)

尝试从第二个to_date参数中删除时间部分:

to_date('11-May-99', 'DD-Mon-YY')

甚至更好:

to_date('11-05-1999', 'DD-MM-YYYY')

这更加强大,因为它与语言无关,不需要猜测世纪。