Oracle 日期的“BETWEEN”SQL 关键字——在 Oracle 中出现错误

Posted

技术标签:

【中文标题】Oracle 日期的“BETWEEN”SQL 关键字——在 Oracle 中出现错误【英文标题】:"BETWEEN" SQL Keyword for Oracle Dates -- Getting an error in Oracle 【发布时间】:2012-05-14 00:49:13 【问题描述】:

我的数据库“01-APR-12”中有这种格式的日期,并且该列是 DATE 类型。

我的 SQL 语句如下所示:

SELECT DISTINCT c.customerno, c.lname, c.fname
FROM customer c, sales s
WHERE c.customerno = s.customerno AND s.salestype = 1 
AND (s.salesdate BETWEEN '01-APR-12' AND '31-APR-12');

当我尝试这样做时,我收到此错误 -- ORA-01839: date not valid for month specified。

我什至可以在数据库中设置日期的方式中使用 BETWEEN 关键字吗?

如果没有,是否有另一种方法可以获得该日期范围内的数据输出,而无需修复数据库中的数据?

谢谢!

【问题讨论】:

【参考方案1】:

四月有 30 天而不是 31 天。

改变

SELECT DISTINCT c.customerno, c.lname, c.fname
FROM customer c, sales s
WHERE c.customerno = s.customerno AND s.salestype = 1 
AND (s.salesdate BETWEEN '01-APR-12' AND '31-APR-12');

SELECT DISTINCT c.customerno, c.lname, c.fname
FROM customer c, sales s
WHERE c.customerno = s.customerno AND s.salestype = 1 
AND (s.salesdate BETWEEN '01-APR-12' AND '30-APR-12');

你应该很高兴。

【讨论】:

让我吃惊的是我能做这么愚蠢的事情...谢谢你的帮助! 太酷了——我想没有一个活着的程序员没有犯过这么简单的错误;将其视为一个指标,表明现在是离开计算机一段时间并呼吸新鲜空气的好时机!不要忘记点击勾选接受我的回答:)【参考方案2】:

如果您要检查的日期范围从一个月的第一天到一个月的最后一天,那么您可以修改查询以避免您必须明确检查该月的最后一天的情况


SELECT DISTINCT c.customerno, c.lname, c.fname
  FROM customer c, sales s
 WHERE c.customerno = s.customerno
   AND s.salestype = 1 AND (s.salesdate BETWEEN '01-APR-12' AND LAST_DAY(TO_DATE('APR-12', 'MON-YY'));

LAST_DAY 函数将提供该月的最后一天。

【讨论】:

【参考方案3】:

其他答案错过了一些重要的事情,并且不会返回正确的结果。日期具有日期和时间组件。如果您的 salesdate 列实际上是包含时间的日期,那么您将错过 4 月 30 日发生的任何销售,除非它们恰好发生在午夜。

这是一个例子:

create table date_temp  (temp date);
insert into date_temp values(to_date('01-APR-2014 15:12:00', 'DD-MON-YYYY HH24:MI:SS'));
insert into date_temp values(to_date('30-APR-2014 15:12:00', 'DD-MON-YYYY HH24:MI:SS'));

表 DATE_TEMP 已创建。

已插入 1 行。

已插入 1 行。

select * from date_temp where temp between '01-APR-2014' and '30-APR-2014';

查询结果:01-APR-14

如果您想获取四月的所有记录,包括日期字段中包含时间成分的记录,您应该使用下个月的第一天作为 between 子句的第二侧:

select * from date_temp where temp between '01-APR-2014' and '01-MAY-2014';

01-APR-14

30-APR-14

【讨论】:

以上是关于Oracle 日期的“BETWEEN”SQL 关键字——在 Oracle 中出现错误的主要内容,如果未能解决你的问题,请参考以下文章

oracle 关于年龄计算问题?

Oracle SQL NOT BETWEEN 未返回正确数据

日期计算(SQL、Oracle 10g)

检查当前日期是不是在两个日期之间 Oracle SQL

从sql表里截取字符串中的日期

【SQL语句】-范围查询