Oracle 转换为时间戳

Oracle 转换为时间戳,oracle,Oracle,我得到了一个列,其时间戳格式如下,当前存储为varchar2: 31DEC2019 13:20:51,847 我真的不认识这种格式,而且我很难编写一个捕获值的掩码。我尝试过使用它及其变体: 'DDMONYYYY HH:MIN:SSFF3' 但是没有运气。有什么想法吗?我的目标是将列从varchar2转换为timestamp,这应该是正确的格式: 'ddmonyyyyyyyy HH24:MI:SS,FF3' 我们有: DD:天 MONmonth YYYYyear HH24:24小时格式的小时

我得到了一个列,其时间戳格式如下,当前存储为varchar2:

31DEC2019 13:20:51,847
我真的不认识这种格式,而且我很难编写一个捕获值的掩码。我尝试过使用它及其变体:

'DDMONYYYY HH:MIN:SSFF3'

但是没有运气。有什么想法吗?我的目标是将列从varchar2转换为timestamp,这应该是正确的格式:

'ddmonyyyyyyyy HH24:MI:SS,FF3'

我们有:

  • DD
    :天
  • MON
    month
  • YYYY
    year
  • 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
这是因为在示例中,“十二月”在意大利语中是“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.

这似乎更正确,谢谢!它给了我一个错误,虽然关于“不是一个有效的月份”使用该面具-即使所有的月份缩写是正确的。有什么想法吗?只是增加了一些细节。这就成功了!谢谢你,我从中学到了很多:)不客气!