我正在开发一个复制项目,其中数据在oracle以及sybase数据库中的sql server上进行复制。
基本上,sybase中的一个表填充了要复制的数据
Sybase列包含类似 -
的数据{“a”:“b”,“c”:“d”,“created_date”:“'2019年2月13日上午1:33'}}
所以基本上当我们在sql server和oracle上复制查询时,我们使用日期字符串'Feb 13 2018 1:33 AM'转换为oracle和sql server的日期。
这个日期字符串适用于sql server,但失败了,错误如 -
ORA-01858在数字预期的情况下发现了一个非数字字符
那么我应该在Sybase中使用哪种日期格式,以便它可以同时用于oracle和sql server复制。
答案 0 :(得分:2)
Oracle将使用TO_DATE( date_string, format_model, nls_params )
函数隐式尝试将字符串转换为日期。如果没有格式模型,Oracle将使用默认日期格式,即NLS_SESSION_PARAMETERS
表中存储的会话参数(每个用户设置也是如此),您可以使用以下命令找到默认值:
SELECT value
FROM NLS_SESSION_PARAMETERS
WHERE parameter = 'NLS_DATE_FORMAT'
这意味着转换将隐含地为:
TO_DATE(
'Feb 13 2018 1:33AM',
(SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT')
)
如果格式模型与您的字符串不匹配,那么您将获得异常。
您可以将输出格式设置为与Oracle的默认值匹配,也可以使用以下命令更改当前Oracle会话中的默认日期格式以匹配当前数据:
ALTER SESSION SET NLS_DATE_FORMAT = 'Mon DD YYYY HH12:MIAM';
您还可以创建登录触发器,以在用户连接到数据库并启动会话时更改NLS设置。
另一种选择是,不是尝试使用字符串而是使用时间戳文字,因为您可以指定时间组件(不能使用日期文字),然后让Oracle将其转换回日期:
TIMESTAMP '2018-02-13 01:33:00'
或者您可以在Oracle的复制查询中显式调用TO_DATE
并指定日期格式:
TO_DATE( 'Feb 13 2018 1:33AM', 'Mon DD YYYY HH12:MIAM' )