2

我的数据库“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 关键字与数据库中的日期设置方式结合使用吗?

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

谢谢!

4

3 回答 3

5

四月有 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');

你应该很高兴。

于 2012-05-14T00:51:57.410 回答
1

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


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 函数将提供该月的最后一天。

于 2012-05-14T09:46:32.973 回答
0

其他答案错过了一些重要的事情,并且不会返回正确的结果。日期具有日期和时间组件。如果您的 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

14 年 4 月 30 日

于 2015-02-02T22:21:15.057 回答