首页 > 解决方案 > 插入日期,Oracle 12,Flyway

问题描述

在设置现有项目时(因此我无法更改脚本),数据迁移在此行失败;

insert into TABLE(NSQ, COD, TEXT, DAT_LAST) 
  values(1, 'EN', 'sample',to_timestamp('28-SEP-15 06.40.45.000000000 PM','DD-MON-RR HH.MI.SSXFF AM'));

出现错误:“ORA-1843”,不是有效月份。

nls_session_parameters 上的查询将语言显示为“美国”,日期格式显示为“DD-MON-RR”。

让我感到困惑的是,插入在通过flyway运行时不起作用,但在SQL Developer(同一个数据库)中运行时它成功而没有任何问题。

标签: sqloracledateoracle-sqldeveloperflyway

解决方案


在您的示例中,“DD-MON-RR HH.MI.SSXFF AM”中的 X 是一个基数字符(点)。大多数系统将其识别为整数 SS 和分数 FF 之间的分隔符,但显然 Flyway 没有。在 oracle 中,这 3 种格式在功能上是等效的: to_timestamp('28-SEP-15 06.40.45.000000000 PM','DD-MON-RR HH.MI.SSXFF AM')
to_timestamp('28-SEP-15 06.40.45.000000000 PM' ,'DD-MON-RR HH.MI.SS.FF AM') to_timestamp('28-SEP-15 06.40.45.000000000 PM','DD-MON-RR HH.MI.SS.FF9 AM')

Oracle 文档:小数秒;不打印基数字符。使用 X 格式元素添加基数字符。在 FF 之后使用数字 1 到 9 来指定返回的日期时间值的小数秒部分中的位数。如果不指定数字,则 Oracle 数据库使用为 datetime 数据类型指定的精度或数据类型的默认精度。在时间戳和间隔格式中有效,但在 DATE 格式中无效。

示例:'HH:MI:SS.FF'

从 DUAL 中选择 TO_CHAR(SYSTIMESTAMP, 'SS.FF3'); **结束 Oracle 文档。不幸的是,您似乎需要找到可以更改您的代码以实现兼容性的人。


推荐阅读