我得到一列当前存储为 varchar2 的时间戳格式如下:
31DEC2019 13:20:51,847
我真的不认识这种格式,而且我很难编写一个捕获值的掩码。我试过使用它,以及它的变体:
'DDMONYYYY HH:MIN:SSFF3'
但没有运气。有任何想法吗?我的目标是将列从 varchar2 转换为时间戳
答案 0 :(得分:1)
这应该是正确的格式:
'DDMONYYYY HH24:MI:SS,FF3'
这里有:
DD
:天MON
个月YYYY
年HH24
:24 小时制的小时MI
:分钟SS
:秒,
:分隔符FF3
毫秒这假设您的字符串代表会话使用的语言中的时间戳;例如,假设您存储了该值,如果您使用英语进行会话,则一切正常:
SQL> alter session set nls_language='English';
Session altered.
SQL> select to_timestamp('31DEC2019 13:20:51,847', 'DDMONYYYY HH24:MI:SS,FF3') as t from dual;
T
---------------------------------------------------------------------------
31-DEC-19 01.20.51.847000000 PM
1 row selected.
对于相同的数据,不同的会话语言可能会出错:
SQL> alter session set nls_language='Italian';
Modificata sessione.
SQL> select to_timestamp('31DEC2019 13:20:51,847', 'DDMONYYYY HH24:MI:SS,FF3') as t from dual;
select to_timestamp('31DEC2019 13:20:51,847', 'DDMONYYYY HH24:MI:SS,FF3') as t from dual
*
ERRORE alla riga 1:
ORA-01843: mese non valido
发生这种情况是因为,在示例中,“December”在意大利语中是“Dicembre”,因此月份部分应该是“DIC”而不是“DEC”。
无论会话语言如何,如果您知道数据是以英语或任何其他语言存储的,则可以在 to_timestamp
调用中强制使用所需的语言:
SQL> select to_timestamp('31DEC2019 13:20:51,847', 'DDMONYYYY HH24:MI:SS,FF3', 'NLS_DATE_LANGUAGE = English') as t from dual;
T
---------------------------------------------------------------------------
31-DIC-19 01.20.51.847000000 PM
1 riga selezionata.