Oracle中产生 “0000-00-00”格式的日期
某需求上线后系统中出现很多日期为'0000-00-00'的数据,此种数据为错误数据并不是预期结果,并且不确定是如何产生的。
尝试使用select to_date('0000-00-00','yyyy-mm-dd') from dual; 查询报错,根本无法得到这个日期的数据。
尝试Insert同样不能成功。
排查发现该日期通过JAVA处理后存入数据库,怀疑转换有问题。后测试发现,当页面将日期录入为'9999-99-99',JAVA可以将其转换,
结果为“Thu Jun 07 00:00:00 CST 10007”。我们看到,实际年份变为了10007,JAVA将99个月视为合法并进位,此时存入数据库结果显示为“0000-00-00”。
但此时实际数据库记录的应该为10007,只是无法显示通过一下语句验证,“0000-00-00”是大于“9999-09-09”:
SQL> select dump(c.end_date),c.end_date,dump(tc.insert_time),c.insert_time
2 from customer c where c.end_date > to_date('9999-09-09','yyyy-mm-dd') and c.customer_id =4100026927;
DUMP(C.END_DATE) END_DATE DUMP(C.INSERT_TIME) INSERT_TIME
-------------------------------------- -------------- ---------------------------------------- -----------
Typ=12 Len=7: 199,199,11,29,1,1,1 9999-11-29 Typ=12 Len=7: 120,109,12,28,18,54,2 2009-12-28
附JAVA代码:
public static java.util.Date toDate(int year, int month, int date) {
return toDate(year, month, date, 0, 0, 0);
}
public static java.util.Date toDate(int year, int month, int date, int hrs,
int min, int sec) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, date, hrs, min, sec);
return calendar.getTime();
}