Oracle - 我应该在比较之前用to_date转换日期吗?

时间:2013-06-04 12:26:18

标签: sql oracle

在查询中,我偶然发现每个日期在进行任何比较之前使用to_date函数进行转换。有时它导致“文字与格式字符串不匹配”错误,这与格式无关,原因在此解释: ORA-01861: literal does not match format string

我的问题是:是否真的有必要使用日期转换?为什么在应用任何逻辑比较之前首先将其转换?

3 个答案:

答案 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
如果您已有日期,请直接使用。