1

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

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

4

3 回答 3

4

Oracle 不会将日期存储为日期。问题是日期上的某个时间可能会导致它们不相等。(有关日期数据类型的信息,您可以在此处查看文档。)

一般来说,我们认为“2013-01-01”等于“2013-01-01”。但是,第一个日期可能是“2013-01-01 01:00:00”,第二个日期可能是“2013-01-01 02:02:02”。他们不会是平等的。更糟糕的是,它们在打印出来时可能看起来一样。

您实际上不必将日期转换为字符串即可进行此类比较。您也可以使用该trunc()功能。数据的这种转换是防止数据的“不可见”时间分量干扰比较的保险。

于 2013-06-04T13:10:56.987 回答
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;

仅举几个例子,但最好将日期视为日期,而不是字符串。

于 2013-06-04T13:29:24.333 回答
0

如果您有一个表示日期的字符串,请使用. 如果您已经有日期,请直接使用它。TO_DATE

于 2013-06-04T12:31:08.537 回答