SQL BETWEEN 不起作用

5
我正在运行以下语句在 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
我不明白01-Jan-11怎么会在01-Jan-99和11-May-99之间... - Daniel Hilgarth
2
列 br.History_Date 是什么类型? - Daniel Hilgarth
1
@Daniel Hilgarth,那只是一个示例,展示日期格式。他们并不是确切的日期。该列类型为日期。 - Graham
3个回答

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 中日期的一种常见但不正确的解释。日期字段始终以相同的内部格式存储。有关如何使用转换函数中的格式模式来确定数据如何转换为/从内部格式转换,这才是重点。


2
+1:这就是问题所在 - 通过在查询的select-list中使用TO_DATE表达式可以发现。 - Jonathan Leffler

5

在日期格式中使用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:这就是问题所在 - 通过在查询的select-list中使用TO_DATE表达式可以发现。 - Jonathan Leffler

3
尝试从第二个to_date参数中删除时间部分:
to_date('11-May-99', 'DD-Mon-YY')

甚至更好的是:
to_date('11-05-1999', 'DD-MM-YYYY')

这种方法更加健壮,因为它不依赖于语言,并且不需要猜测世纪。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接