sybase、oracle 和 sql 服务器的有效日期格式
valid date format for sybase, oracle and sql server
我正在做一个复制项目,其中的数据在 oracle 上以及 sql 服务器上从 sybase 数据库复制。
基本上,sybase 中的一个表会填充要复制的数据
Sybase 列包含类似 -
的数据
{"a":"b","c":"d","created_date":"'Feb 13 2018 1:33AM'"}
所以基本上当我们形成查询以在 sql 服务器和 oracle 上复制时,我们使用日期字符串 'Feb 13 2018 1:33AM' 转换为 oracle 和 sql 服务器的日期。
这个日期字符串在 sql 服务器上工作正常,但失败并出现类似 -
的错误
ORA-01858 在需要数字的地方发现了非数字字符
那么我应该在 Sybase 中使用哪种日期格式,以便它适用于 oracle 和 sql 服务器进行复制。
Oracle 将隐式尝试使用 TO_DATE( date_string, format_model, nls_params )
函数将字符串转换为日期。如果没有格式模型,Oracle 将使用默认日期格式,这是存储在 NLS_SESSION_PARAMETERS
table 中的会话参数(每个用户设置也是如此),您可以使用以下命令找到默认值:
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' )
我正在做一个复制项目,其中的数据在 oracle 上以及 sql 服务器上从 sybase 数据库复制。
基本上,sybase 中的一个表会填充要复制的数据
Sybase 列包含类似 -
的数据{"a":"b","c":"d","created_date":"'Feb 13 2018 1:33AM'"}
所以基本上当我们形成查询以在 sql 服务器和 oracle 上复制时,我们使用日期字符串 'Feb 13 2018 1:33AM' 转换为 oracle 和 sql 服务器的日期。
这个日期字符串在 sql 服务器上工作正常,但失败并出现类似 -
的错误ORA-01858 在需要数字的地方发现了非数字字符
那么我应该在 Sybase 中使用哪种日期格式,以便它适用于 oracle 和 sql 服务器进行复制。
Oracle 将隐式尝试使用 TO_DATE( date_string, format_model, nls_params )
函数将字符串转换为日期。如果没有格式模型,Oracle 将使用默认日期格式,这是存储在 NLS_SESSION_PARAMETERS
table 中的会话参数(每个用户设置也是如此),您可以使用以下命令找到默认值:
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' )