在查询中,我偶然发现每个日期在进行任何比较之前使用to_date函数进行转换。有时它导致“文字与格式字符串不匹配”错误,这与格式无关,原因在此解释: ORA-01861: literal does not match format string
我的问题是:是否真的有必要使用日期转换?为什么在应用任何逻辑比较之前首先将其转换?
答案 0 :(得分:3)
Oracle不会将日期存储为日期。问题是日期可能会有一段时间导致它们不平等。 (有关日期数据类型的信息,您可以查看文档here。)
一般来说,我们认为“2013-01-01”等于“2013-01-01”。但是,第一个日期可能是“2013-01-01 01:00:00”,第二个日期可能是“2013-01-01 02:02:02”。他们不平等。更糟糕的是,它们在打印出来时可能看起来一样。
您实际上不必将日期转换为字符串以进行此类比较。您也可以使用trunc()
功能。数据的这种转换是针对干扰比较的数据的“不可见”时间成分的保险。
答案 1 :(得分:1)
您应该将日期存储为实际日期(或时间戳)。如果您有表示日期的字符串,则通常需要使用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;
仅举几个例子,但将日期视为日期更好,而不是字符串。
答案 2 :(得分:0)
如果字符串 代表日期,请使用TO_DATE
。
如果您已有日期,请直接使用。