TO_DATE 中最后一个 .0 的 oracle 格式是啥('2020-04-01 00:00:00.0','YYYY-MM-DD HH24:MI:SS.TZR')?

Posted

技术标签:

【中文标题】TO_DATE 中最后一个 .0 的 oracle 格式是啥(\'2020-04-01 00:00:00.0\',\'YYYY-MM-DD HH24:MI:SS.TZR\')?【英文标题】:What is oracle format for last .0 in TO_DATE ('2020-04-01 00:00:00.0','YYYY-MM-DD HH24:MI:SS.TZR')?TO_DATE 中最后一个 .0 的 oracle 格式是什么('2020-04-01 00:00:00.0','YYYY-MM-DD HH24:MI:SS.TZR')? 【发布时间】:2020-07-26 21:52:56 【问题描述】:

我从 Java 得到这个日期,是日期类型。

所以尝试在oracle中格式化

select TO_DATE ('2020-04-01 00:00:00.0','YYYY-MM-DD HH24:MI:SS.TZR') from DUAL

无法格式化最后一个 .0 日期。尝试了各种方法

.TZR
  TZR

不确定如何格式化?如果我删除 .0 和 .TZR 则一切正常。

我收到以下错误:

ORA-01820: 格式代码不能出现在日期输入格式中 01820. 00000 - “格式代码不能出现在日期输入格式中”

【问题讨论】:

DATE 数据类型没有小数秒和时区,您需要使用 TIMESTAMP。为了简单起见,您可以使用使用固定格式的 ANSI 文字。请参阅日期时间文字文档docs.oracle.com/database/121/SQLRF/… 看来你有一个java.sql.Timestamp 并应用了它的toString 方法。 Timestamp 类的设计很差而且已经过时了,所以首先看看你是否可以得到一个InstantOffsetDateTimeLocalDateTime。接下来将其中一个发送到您的数据库而不是字符串,这样您就不需要在 SQL 端进行任何转换。 正如我已经说过的,.0 是小数秒部分。阅读我上面提供的文档链接。 DATE 不能超过秒,TIMESTAMP 可以存储小数秒和时区值。 @fatherazrael 那行得通。但是,如果您从 Java 应用程序本身获取它作为 DATE 或 TIMESTAMP 会比在 SQL 中操作文字更好。 "我从 Java 得到这个日期并且是日期类型。" - 你应该通过java.time.LocalDateTime(或至少java.sql.Timestamp)检索和存储 DATE 值作为字符串。 【参考方案1】:

.0 是小数秒,而不是时区偏移;但是日期数据类型无论如何都不允许。

如果您的字符串始终包含.0,那么您可以将其视为固定字符以忽略它:

select TO_DATE ('2020-04-01 00:00:00.0','YYYY-MM-DD HH24:MI:SS".0"') from DUAL;

TO_DATE('2020-04-01
-------------------
2020-04-01 00:00:00

如果它可能不为零,或者只是您愿意,可以将其转换为时间戳,然后将其转换为日期:

select CAST( TO_TIMESTAMP ('2020-04-01 00:00:00.0','YYYY-MM-DD HH24:MI:SS.FF') AS DATE) from DUAL;

CAST(TO_TIMESTAMP('
-------------------
2020-04-01 00:00:00

FF 格式模型元素表示小数秒,as the documentation says 表示“在时间戳和间隔格式中有效,但在 DATE 格式中无效”。

从 Java 中获取值的含义并不完全清楚,但如果您正在进行 JDBC 调用并将参数作为字符串传递,您应该退后一步,改用正确的 JDBC 数据类型。如果可以的话,还要注意@Ole 关于使用现代 Java 数据类型的评论。

【讨论】:

【参考方案2】:

这种格式可以通过之前的类型信息轻松转换

从 DUAL 中选择时间戳'2020-04-01 01:02:03.4'

to_timestamp也可以用在select stmt中。

【讨论】:

以上是关于TO_DATE 中最后一个 .0 的 oracle 格式是啥('2020-04-01 00:00:00.0','YYYY-MM-DD HH24:MI:SS.TZR')?的主要内容,如果未能解决你的问题,请参考以下文章

mybaties 和 oracle的to_date函数的问题

oracle中的to_date函数

获取Oracle中两个日期之间的天数,包括日期

ORACLE按每月每周关联数据表

oracle中to_date详细用法示例(oracle日期格式转换)

关于Oracle中to_date的用法