Oracle将隐式尝试使用。将字符串转换为日期 TO_DATE( date_string, format_model, nls_params ) 功能。如果没有格式模型,Oracle将使用默认日期格式,该格式是存储在其中的会话参数(因此是每用户设置) NLS_SESSION_PARAMETERS 表,你可以使用以下方法找到默认值:
TO_DATE( date_string, format_model, nls_params )
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'
或者你可以明确地打电话 TO_DATE 在Oracle的复制查询中,并指定日期格式:
TO_DATE
TO_DATE( 'Feb 13 2018 1:33AM', 'Mon DD YYYY HH12:MIAM' )