如何将 2020-08-17 02:18:34+0000 转换为 Oracle DATE 类型
Posted
技术标签:
【中文标题】如何将 2020-08-17 02:18:34+0000 转换为 Oracle DATE 类型【英文标题】:How to convert 2020-08-17 02:18:34+0000 to Oracle DATE type 【发布时间】:2021-02-02 14:25:16 【问题描述】:我将“2020-08-17 02:18:34+0000”作为 CSV 字符串,并希望将其插入到具有 DATE 类型的 oracle 表列中。我正在通过 JDBC 批处理代码加载表。我试过了
TO_DATE (TO_CHAR (TO_TIMESTAMP ('2020-08-17 02:18:34+0000', 'RRRR-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS')
但它没有工作。请帮忙。谢谢。
编辑 错误信息: 错误报告 - SQL 错误:ORA-01830:日期格式图片在转换整个输入字符串之前结束 01830. 00000 - “日期格式图片在转换整个输入字符串之前结束” *原因: *行动:
【问题讨论】:
“没有工作”在任何错误消息中都找不到。帮助我们帮助您。不要让我们猜测错误信息是什么。 在java中你可以用LocalDate.parse
(接受DateTimeFormatter
作为第二个输入的那个)解析它。然后toString
方法将返回一个格式应该与sql日期兼容的日期(即YYYY-mm-dd
)
你有一个逻辑问题,在去“代码”之前。你所拥有的不是时间戳。它是一个带有时区的时间戳。如果您忽略时区,您将丢失信息。 所有您的输入是否会位于同一时区 +0000,即 UTC (GMT)?如果没有,您肯定会丢失信息。
【参考方案1】:
如果您将时间戳存储为 DATE - 您将失去上下文。字符串末尾的 +0000 是否代表 UTC 时区,如 +/- '0 hours'?
如果您有一些大于 +0 的条目,则删除该信息将改变上下文。爱尔兰的下午 3 点不是纽约市的下午 3 点。使用 DATES 会丢失所有上下文,是否需要翻译这些时差?
select cast(to_timestamp('2020-08-17 02:18:34+0000', 'YYYY-MM-DD HH:MI:SS+FF') as date) dates from dual;
如果您想将 +0000 视为您的日期格式模型的一次性文本,您也可以使用
select to_date('2020-08-17 02:18:34+0000', 'YYYY-MM-DD HH:MI:SS"+0000"') dates from dual;
【讨论】:
错误...不。掩码应为'...MI:SSTZHTZR'
。 “加号”不是分隔符,它是代数符号(TZH 的一部分);和 FF 是小数秒,它不存在于 OP 的输入中。您的格式模型将 +0000 解释为小数秒而不是时区小时和分钟;尽管 OP 认为它是正确的,但绝对是错误的。
对不起-我的意思是TZHTZM
。现在:也许缺少冒号会让你失望(虽然军事时间技术上不使用冒号,所以这并不“不寻常”);但是 + 号作为小数分隔符?曾经吗?
我试图撤回我的答案,但它已被 OP 接受,是否有上帝不接受答案?
替代方法是编辑答案以使其正确:-) 在我看来,最简单的解决方案 - 假设所有日期的时区 +0000 - 将其视为样板文本(如双引号中的格式模型),并直接使用 TO_DATE。不过,更大的问题 - 请参阅我在 OP 问题下的评论 - 是一个合乎逻辑的问题。输入是带有时区的时间戳。另存为 DATE 会丢失信息。
对,他们可以接受失去 tz 吗?他们是否意识到 ts 与 tz 和 date 之间的区别?【参考方案2】:
TO_TIMESTAMP ('2020-08-17 02:18:34+0000', 'RRRR-MM-DD HH24:MI:SS')
您的描述“RRRR-MM-DD HH24:MI:SS”与时间戳的字符串表示不匹配。您必须考虑“+0000”
另外,请注意,RR 格式掩码是一种创可贴,可以为处理 Y2k 错误赢得一些时间。那是二十多年前的事了。早就放弃它并使用YYYY了。
【讨论】:
以上是关于如何将 2020-08-17 02:18:34+0000 转换为 Oracle DATE 类型的主要内容,如果未能解决你的问题,请参考以下文章