您确实应该将日期存储为实际日期(或时间戳)。如果您有表示日期的字符串,您通常需要使用 to_date 转换它们(使用指定的格式,不依赖于默认格式)。这实际上取决于您想要什么比较/日期功能。您遇到错误是因为您遇到的值不符合您指定的格式。这也是将列指定为 DATE 以存储日期的一个很好的理由。例如,
select to_date('123', 'MM-DD-YYYY') from dual;
将抛出 ORA-01861。所以你可能有 99.9% 的行是 MM-DD-YYYY,但 0.1% 会让你头疼。
无论如何,如果你清理了这些字符串,你可以使用 to_date 和 date 函数做更多的事情。例如:
select
(last_day(to_date('02-05-2009', 'MM-DD-YYYY')) - to_date('01-15-1998', 'MM-DD-YYYY')) as days_between_dates
from dual;
用字符串来做这件事并不好玩。或者也许只是找到最近的日期:
select greatest( to_date('02-05-2009', 'MM-DD-YYYY'), to_date('12-01-1988', 'MM-DD-YYYY')) from dual;
使用字符串比较会给出错误的答案:
select greatest('02-05-2009', '12-01-1988') from dual;
仅举几个例子,但最好将日期视为日期,而不是字符串。