我的数据库“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:日期对指定月份无效。
我是否可以将BETWEEN关键字与数据库中的日期设置方式一起使用?
如果没有,是否有另一种方法可以获得该日期范围内的数据输出而无需在数据库中修复数据?
谢谢!
答案 0 :(得分: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');
你应该好好去。
答案 1 :(得分: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函数将提供该月的最后一天。
答案 2 :(得分: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
如果你想获得4月份的所有记录,包括日期字段中包含时间成分的记录,你应该使用下个月的第一天作为inter子句的第二面:
select * from date_temp where temp between '01-APR-2014' and '01-MAY-2014';
01-APR-14
30-APR-14