sybase,oracle和sql server的有效日期格式

时间:2018-02-13 10:30:28

标签: sql-server oracle sybase

我正在开发一个复制项目,其中数据在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复制。

1 个答案:

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