Oracle TO_DATE 函数中的跳过字符
Skip Characters in Oracle TO_DATE function
我正在使用 SQL 开发人员的导入数据向导将具有 SQL 服务器格式日期的 .tsv (yyyy-mm-dd hh24:mi:ss.mmm
) 数据导入 Oracle 数据库。
如何忽略 .mmm
字符以将它们导入 DATE 列?我似乎无法找到答案;我知道 DATE 列不包含毫秒,但为什么我不能忽略 TO_DATE 调用中的特定模式?
另请注意,因为我没有生成 TO_DATE 调用,所以我不能 SUBSTRING
或在导入过程中以其他方式操纵 .tsv 的值。
没有必要这样做;如果您尝试将小数秒添加到日期列,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>
您可以为此使用井号 (#
):
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
我正在使用 SQL 开发人员的导入数据向导将具有 SQL 服务器格式日期的 .tsv (yyyy-mm-dd hh24:mi:ss.mmm
) 数据导入 Oracle 数据库。
如何忽略 .mmm
字符以将它们导入 DATE 列?我似乎无法找到答案;我知道 DATE 列不包含毫秒,但为什么我不能忽略 TO_DATE 调用中的特定模式?
另请注意,因为我没有生成 TO_DATE 调用,所以我不能 SUBSTRING
或在导入过程中以其他方式操纵 .tsv 的值。
没有必要这样做;如果您尝试将小数秒添加到日期列,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>
您可以为此使用井号 (#
):
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