跳过Oracle TO_DATE函数中的字符

时间:2015-03-24 10:02:19

标签: sql date oracle11g to-date

我正在使用SQL Developer的Import Data向导将.tsv(yyyy-mm-dd hh24:mi:ss.mmm)中具有SQL Server格式的日期的数据导入Oracle数据库。

如何将.mmm字符忽略为将其导入DATE列?我似乎无法找到答案;我得到DATE列不能保持毫秒,但为什么我不能忽略TO_DATE调用中的特定模式?

另请注意,因为我没有生成TO_DATE调用,所以我无法在导入过程中SUBSTRING或以其他方式操纵.tsv的值。

Import Data Wizard - Date

2 个答案:

答案 0 :(得分:3)

您可以使用井号(#):

SELECT TO_DATE('2015-01-01 01:00:00.999', 'yyyy-mm-dd hh24:mi:ss.###') FROM dual;
--> 01/01/2015 01:00:00

我在documentation中没有找到这个,所以我不能说出原因,但这些也有效:

SELECT TO_DATE('01_','hh24#') FROM dual;

SELECT TO_DATE('01:01:01.0xx','hh24:mi:ss.###') FROM dual;

这些似乎不起作用:

SELECT TO_DATE('010','hh24#') FROM dual;

SELECT TO_DATE('01:01:01.xxx','hh24:mi:ss.###') FROM dual;

这似乎没有记录,但您似乎能够毫无问题地交换标点符号:

SELECT TO_DATE('2015-01;01 11:12/13',
               'yyyy.mm,dd_hh-mi ss') FROM dual;
--> 01/01/2015 11:12:13

如果您知道要忽略的文本,可以使用字符文字,用双引号括起来

SELECT TO_DATE('foo2015bar-01-!#%}01', '"foo"yyyy"bar"-mm-"!#%}"dd') FROM dual;
--> 01/01/2015

答案 1 :(得分:1)

没有必要这样做;如果您尝试将小数秒添加到日期列,Oracle会自动将时间戳转换为日期。请改用TO_TIMESTAMP()并使用小数秒。

SQL> create table tmp_test (dt date);

Table created.

SQL> insert into tmp_test
  2  select to_timestamp('2015-03-24 13:10:03.654','yyyy-mm-dd hh24:mi:ss.FF3')
  3    from dual;

1 row created.

SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';

Session altered.

SQL> alter session set nls_timestamp_format = 'yyyy-mm-dd hh24:mi:ss.FF3';

Session altered.

SQL> select * from tmp_test;

DT
-------------------
2015-03-24 13:10:03

SQL>