转换为时间戳

时间:2021-02-02 12:29:18

标签: oracle

我得到一列当前存储为 varchar2 的时间戳格式如下:

31DEC2019 13:20:51,847

我真的不认识这种格式,而且我很难编写一个捕获值的掩码。我试过使用它,以及它的变体:

'DDMONYYYY HH:MIN:SSFF3'

但没有运气。有任何想法吗?我的目标是将列从 varchar2 转换为时间戳

1 个答案:

答案 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.