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' )