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有什么问题吗?
的问题不是格式模型的时间成分,它是“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中。这些都是关于如何在转换函数中使用格式模型,这些转换函数规定了数据如何转换为内部格式。
+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')
+1:这是麻烦 - 正如通过在双查询的选择列表中使用TO_DATE表达式所发现的那样。 – 2011-05-12 15:10:44
我没有看到01年1月1日是介于99年1月1日和99年5月11日之间...... – 2011-05-12 14:34:42
列br.History_Date是什么类型? – 2011-05-12 14:36:07
@Daniel Hilgarth这只是一个例子来说明日期的格式。他们不是确切的日期。列类型是Date。 – Graham 2011-05-12 16:09:57