【问题标题】:SQL*Loader/SQL date formatting issuesSQL*Loader/SQL 日期格式问题
【发布时间】:2016-02-10 15:23:54
【问题描述】:

我正在尝试创建一个每天将文件上传到 Oracle 数据库的自动化流程。

我遇到了日期格式问题。在我需要上传的 CSV 文件中,日期格式为“mm:ss.0”。 However when selecting that cell the formula bar shows the full date as a timestamp, eg "dd/mm/yyyy hh24:mi:ss".我尝试将其上传到的列是 TIMESTAMP(6)。

我不确定在 SQL*Loader 中放入什么格式。目前这是我的控制文件,其中错误:

OPTIONS (SKIP=1)
LOAD DATA
INFILE 'C:\Users\test.csv'
INSERT INTO TABLE test
FIELDS TERMINATED BY "," 
TRAILING NULLCOLS
(
id integer,
created_at timestamp 'DD/MM/YYYY HH24:MI:SS',
)

可能是错误的,我目前的假设是,如果我可以在手动 Oracle SQL 上传窗口中找出要放入“数据类型”框中的内容,这也适用于 SQL*Loader。到目前为止,我已经尝试过:

  • DD/MM/YYYY HH24:MI:SS - 错误:CREATED_AT GDK-05043:不是一个有效的月份
  • DD/MM/YYYY HH24:MI:SS.FF - 错误:CREATED_AT GDK-05043:无效月份
  • MI:SS.0 - 错误:CREATED_AT GDK-05021:日期格式无法识别
  • MI:SS.FF - 错误:CREATED_AT GDK-05030:日期格式模式在转换整个输入字符串之前结束。
  • HH24:MI:SS.FF 错误:CREATED_AT GDK-05030:日期格式模式在转换整个输入字符串之前结束。

文件是通过电子邮件发送给我的,所以我无法更改 Excel 中的格式(虽然如果我打开文件并手动进行一次上传,这可以工作,但我希望这发生在我没有输入!)

如果你能指出我正确的方向,那就太好了。

【问题讨论】:

  • 不是在 excel 中打开文件,而是在文本编辑器中打开该文件时,您会在该日期字段中看到什么?
  • 我看到了“yyyy-mm-dd HH24:MI:SS.0”。在 oracle 中尝试并得到以下错误:“CREATED_AT GDK-05030:日期格式模式在转换整个输入字符串之前结束。
  • 我想知道您在文本编辑器中打开 csv 文件时看到的内容,而不是尝试加载数据后收到的错误消息。 EXCEL 会乱用文本/日期/数字格式,因此您在 EXCEL 中看到的内容实际上可能不是文件中的内容。
  • 抱歉,我按下回车键并在我完成输入之前发送了评论...编辑它以显示我在记事本中看到的格式。非常感谢这个提示 - 不知道 excel 不会正确显示格式。
  • select to_timestamp('2016-02-10 15:42:12.3', 'yyyy-mm-dd hh24:mi:ss.ff') from dual; 对我来说很好;该列中所有数据的格式是否相同?

标签: sql oracle formatting timestamp sql-loader


【解决方案1】:

@Boneist 的格式为您指明了 SQL*Loader 中的工作;将控制文件修改为:

OPTIONS (SKIP=1)
LOAD DATA
INFILE 'test.csv'
INSERT INTO TABLE test
FIELDS TERMINATED BY ","
TRAILING NULLCOLS
(
id integer,
created_at timestamp 'YYYY-MM-DD HH24:MI:SS.FF'
)

test.csv 包含:

ID,Created at
1,2016-02-10 12:13:14.0

加载记录很好:

Total logical records skipped:          1
Total logical records read:             1
Total logical records rejected:         0
Total logical records discarded:        0

虽然它可能得不到你期望的数据:

select * from test;

        ID CREATED_AT                 
---------- ----------------------------
 808594481 10-FEB-16 12.13.14.000000000

你可能不是真的指 integer 那里。如果不需要转换,您可以不指定数据类型并让它默认为 CHAR 并回复隐式转换为表列数据类型;或者如果你想指定它,你需要the external keyword:

...
(
id integer external,
created_at timestamp 'YYYY-MM-DD HH24:MI:SS.FF'
)

select * from test;

        ID CREATED_AT                 
---------- ----------------------------
         1 10-FEB-16 12.13.14.000000000

或者你可以指定你想要的转换:

...
(
id "to_number(:id)",
created_at timestamp 'YYYY-MM-DD HH24:MI:SS.FF'
)

【讨论】:

  • 谢谢大家,以上加上纠正一个愚蠢的错字就成功了:)
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多