首页 文章

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

提问于
浏览
1

在查询中,我偶然发现每个日期在进行任何比较之前使用to_date函数进行转换 . 有时它会导致"literal does not match format string"错误,这与格式无关,原因在这里解释:ORA-01861: literal does not match format string

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

3 回答

  • 3

    Oracle不会将日期存储为日期 . 问题是日期可能会有一段时间导致它们不平等 . (有关日期数据类型的信息,请参阅文档here . )

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

    您实际上不必将日期转换为字符串以进行此类比较 . 您也可以使用 trunc() 函数 . 这种数据转换可以防止数据的时间成分干扰比较 .

  • 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;
    

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

  • 0

    如果您有 string 表示日期,请使用 TO_DATE .
    如果您已有日期,请直接使用 .

相关问题