在查询中,我偶然发现每个日期在进行任何比较之前使用to_date函数进行转换 . 有时它会导致"literal does not match format string"错误,这与格式无关,原因在这里解释:ORA-01861: literal does not match format string
我的问题是:是否真的有必要使用日期转换?在应用任何逻辑比较之前,为什么首先将其转换为?
在查询中,我偶然发现每个日期在进行任何比较之前使用to_date函数进行转换 . 有时它会导致"literal does not match format string"错误,这与格式无关,原因在这里解释:ORA-01861: literal does not match format string
我的问题是:是否真的有必要使用日期转换?在应用任何逻辑比较之前,为什么首先将其转换为?
3 回答
Oracle不会将日期存储为日期 . 问题是日期可能会有一段时间导致它们不平等 . (有关日期数据类型的信息,请参阅文档here . )
一般来说,我们认为“2013-01-01”等于“2013-01-01” . 但是,第一个日期可能是“2013-01-01 01:00:00”,第二个日期可能是“2013-01-01 02:02:02” . 他们不平等 . 更糟糕的是,它们在打印出来时可能看起来一样 .
您实际上不必将日期转换为字符串以进行此类比较 . 您也可以使用
trunc()
函数 . 这种数据转换可以防止数据的时间成分干扰比较 .您应该将日期存储为实际日期(或时间戳) . 如果您有表示日期的字符串,则通常需要使用to_date(使用指定的格式,而不是依赖于默认格式)来转换它们 . 这实际上取决于您想要的比较/日期功能 . 您遇到错误,因为您遇到的值不符合您指定的格式 . 这也是将列指定为DATE以存储日期的一个很好的理由 . 例如,
将抛出ORA-01861 . 所以你可能有99.9%的行作为MM-DD-YYYY,但0.1%会让你头疼 .
无论如何,如果你清理这些字符串,你可以使用to_date和date函数做更多的事情 . 例如:
用字符串做这件事并不好玩 . 或者也许只是找到最近的日期:
使用字符串比较会给出错误的答案:
仅举几个例子,但将日期视为日期更好,而不是字符串 .
如果您有 string 表示日期,请使用
TO_DATE
.如果您已有日期,请直接使用 .