SQL BETWEEN无法正常工作

Gra*_*ham 5 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')
Run Code Online (Sandbox Code Playgroud)

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

数据库中的日期采用此格式'01 -Jan-11'.所以我似乎也把日期放在正确的格式中.你看到我写的SQL有什么问题吗?

DCo*_*kie 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> 
Run Code Online (Sandbox Code Playgroud)

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

编辑:

您将声明"数据库中的日期采用此格式'01 -Jan-11'." 这是Oracle中日期的常见但不正确的解释.DATE字段始终以相同的内部格式存储.这一切都与您如何在转换函数中使用格式模型有关,这些函数指示数据如何转换为内部格式/从内部格式转换.

  • +1:这就是麻烦 - 正如在双重查询的选择列表中使用TO_DATE表达式所发现的那样. (2认同)

Dat*_*jam 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')
Run Code Online (Sandbox Code Playgroud)