You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19c中SQL Loader加载时如何正确提取时间戳列的时间部分?

SQL Loader加载Oracle TIMESTAMP列时自动补全当前日期问题

环境与表结构

  • Oracle版本:19.3.0
  • 表创建语句:
CREATE TABLE test
(
  DATE_STAMP         DATE,
  TIMESTAMP          TIMESTAMP(6)
)

测试CSV数据

test.csv内容:

2007/05/13,16:35:24
2007/05/13,18:00:51

原SQL Loader控制文件

OPTIONS(skip=1)
LOAD DATA
        INFILE 'test.csv'
        BADFILE 'test.bad'
        INSERT INTO TABLE test
        FIELDS TERMINATED BY ','
        (
         date_stamp,
         timestamp      TIMESTAMP "HH24:MI:SS.FF2"
        ) 

问题现象

数据加载成功,但TIMESTAMP列被自动拼接了加载当天的日期(示例中为9/1/2023):
执行查询:

select DATE_STAMP, TIMESTAMP from test;

实际结果:

13-MAY-07   9/1/2023 4:35:24.000000 PM
13-MAY-07   9/1/2023 6:00:51.000000 PM

期望结果:

13-MAY-07   4:35:24.000000 PM
13-MAY-07   6:00:51.000000 PM

原因与解决方案

原因

Oracle的TIMESTAMP类型必须包含日期和时间部分,当SQL Loader仅读取时间字符串时,会默认使用当前系统日期补全日期部分。

解决方法

要让TIMESTAMP列使用DATE_STAMP的日期,需在控制文件中拼接日期和时间字段,再转换为TIMESTAMP类型:

修改后的控制文件:

OPTIONS(skip=1)
LOAD DATA
        INFILE 'test.csv'
        BADFILE 'test.bad'
        INSERT INTO TABLE test
        FIELDS TERMINATED BY ','
        (
         date_stamp,
         timestamp      "TO_TIMESTAMP(CONCAT(:date_stamp, ' ', :timestamp), 'YYYY/MM/DD HH24:MI:SS')"
        ) 

可选方案

也可以通过DATE类型中转实现:

OPTIONS(skip=1)
LOAD DATA
        INFILE 'test.csv'
        BADFILE 'test.bad'
        INSERT INTO TABLE test
        FIELDS TERMINATED BY ','
        (
         date_stamp,
         timestamp      "CAST(TO_DATE(:date_stamp || ' ' || :timestamp, 'YYYY/MM/DD HH24:MI:SS') AS TIMESTAMP)"
        ) 

显示优化

如果仅需要查询时显示时间部分,可使用TO_CHAR格式化输出:

SELECT DATE_STAMP, TO_CHAR(TIMESTAMP, 'HH:MI:SS.FF6 PM') AS TIMESTAMP FROM test;

内容的提问来源于stack exchange,提问作者user13708337

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:46:33