<sql>
MERGE INTO A config
USING (SELECT 100 as id, '02.01.15 12:00:00' as CHANGED, 0 as DELETED, 1 as B FROM DUAL) src ON (src.id = config.id)
WHEN NOT MATCHED THEN
INSERT(id,CHANGED, DELETED, B) VALUES(src.id, src.CHANGED, src.DELETED, src.B)
WHEN MATCHED THEN
UPDATE SET config.B = src.B;
</sql>
当我通过liquibase运行它时,我得到错误ORA-01843:不是一个有效的月份。
怎么可能?
'02.01.15 12:00:00'
不是日期,而是字符串;如果试图将其插入到date
数据类型列中,则Oracle将尝试使用以下等效项将其强制转换为日期:
SELECT TO_DATE(
'02.01.15 12:00:00',
( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
) as CHANGED
FROM DUAL
因此,如果NLS_date_format
会话参数与字符串'02.01.15 12:00:00'
的格式不匹配,那么它将引发异常--这是因为您获得的是ORA-01843:不是一个有效的月份
而出现的情况。
最好的解决方案是修改脚本,将字符串显式强制转换为日期:
MERGE INTO A config
USING (
SELECT 100 as id,
TO_DATE( '02.01.15 12:00:00', 'DD.MM.YY HH24:MI:SS' ) as CHANGED,
0 as DELETED,
1 as B
FROM DUAL
) src ON (src.id = config.id)
WHEN NOT MATCHED THEN
INSERT(id,CHANGED, DELETED, B) VALUES(src.id, src.CHANGED, src.DELETED, src.B)
WHEN MATCHED THEN
UPDATE SET config.B = src.B;
但是也可以创建登录触发器来更改NLS_DATE_FORMAT
会话参数。将触发器环绕在以下代码中:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YY HH24:MI:SS';
但是,这将更改从字符串到日期的所有隐式转换中使用的日期格式(反之亦然),因此可能会中断同样依赖于这种隐式转换的其他查询。此外,每个用户都可以随时更改他们的会话参数,因此在登录时设置此默认值依赖于他们在会话期间从不更改它。
[TL;DR]修复脚本,使其不使用数据类型之间的隐式转换,而不是修改用于隐式转换的格式模型。
我为PHP更改了OCI8版本,由于该查询不起作用: 我收到这个消息: 消息:oci_execute():ora-01843:不是有效月份 它与Toad一起用于Oracle11。你有什么解决办法吗? 谢谢:)
我有一个在PL-SQL视图中使用的查询。该视图包含一个名为Jde_date的函数,该函数采用Julian格式的date参数并将其转换为Gregorian格式,它工作得很好。 查询如下: 但是当我发布报告时,我得到错误ORA-01843:不是一个有效的月份。 我该怎么解决?
下面是查询
在浏览结构和XML时,我注意到我的日期是字符串格式的: 元素name=“datetime”value=“datetime”label=“datetime”datatype=“xsd:string”breakorder=“ascending”fieldorder=“3” 所以我删除了to_char以获得日期格式 如何解决此问题? 编辑:列的格式,时间戳,格式是CHAR(14)值的例子是2020070
我遇到以下错误 ORA-01843:不是有效月份 底层视图
我在尝试从按日期筛选的表中选择数据时遇到了一个问题。 例如: null 此选择的结果是: