SQL BETWEEN无法正常工作

问题描述:

我在oracle数据库上运行以下语句。SQL BETWEEN无法正常工作

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

我没有看到01年1月1日是介于99年1月1日和99年5月11日之间...... – 2011-05-12 14:34:42

+2

列br.History_Date是什么类型? – 2011-05-12 14:36:07

+1

@Daniel Hilgarth这只是一个例子来说明日期的格式。他们不是确切的日期。列类型是Date。 – Graham 2011-05-12 16:09:57

的问题不是格式模型的时间成分,它是“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> 

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

编辑:

您做出的声明“在数据库中的日期都是这种格式'01 -Jan-11' 。”这是Oracle中日期的常见但不正确的解释。日期字段始终存储在相同的internal format中。这些都是关于如何在转换函数中使用格式模型,这些转换函数规定了数据如何转换为内部格式。

+2

+1:这是麻烦 - 正如通过在双查询的选择列表中使用TO_DATE表达式所发现的那样。 – 2011-05-12 15:10:16

尝试从第二to_date参数取出一部分时间:

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

甚至更​​好:

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

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

在您的日期格式中使用RR而不是YY。这可能是捡这些日期为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') 
+0

+1:这是麻烦 - 正如通过在双查询的选择列表中使用TO_DATE表达式所发现的那样。 – 2011-05-12 15:10:44