oracle 如何从SQL Loader控制文件的timestamp列中提取时间组件?

a6b3iqyw  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(84)

希望有人能帮我。
Oracle版本:19.3.0

CREATE TABLE test
(
  DATE_STAMP         DATE,
  TIMESTAMP          TIMESTAMP(6)
)

CSV格式的示例数据如下
cat test.csv
2007/05/13,16:35:24
2007/05/13,18:00:51
控制文件:

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"
        )

虽然数据已加载到表中,但格式不正确。
实际结果:
从测试中选择DATE_STAMP、TIMESTAMP;
2023年5月13日9月1日4:35:24.000000 PM
2023年5月7日9月1日6:00:51.000000 PM
注意:由于某种原因,“9/1/2023”被自动添加到TIMESTAMP列。
预期结果:
2007年5月13日下午4:35:24.000000
2007年5月13日下午6:00:51.000000
先谢了。
罗杰7942

hxzsmxv2

hxzsmxv21#

看来你搞错了
时间戳数据类型-在Oracle中-包含日期时间组件,而不仅仅是时间。
Data Types documentation(search for“timestamp”)说道:

date的年、月、日值,以及时间的小时、分钟、秒值**,其中fractional_seconds_precision是SECOND datetime字段小数部分的位数。

换句话说,这类似于不包含小数秒的date数据类型。
如果不指定日期(在将字符串转换为时间戳时),Oracle会将其设置为 * 当前月份的第一个 *:

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

Session altered.

SQL> select to_timestamp('22:36:18', 'hh24:mi:ss') result from dual;

RESULT
---------------------------------------------------------------------------
01.09.2023 22:36:18.000

(今天是2023年9月14日)
当你将时间戳值存储到一个表中时,你可以选择以不同的方式显示它,例如:仅日期组件或仅时间组件,可以使用任何格式。举例来说:

SQL> create table test (col timestamp);

Table created.

SQL> insert into test values (systimestamp);

1 row created.

SQL> select * from test;

COL
---------------------------------------------------------------------------
14.09.2023 22:38:33.233

SQL> select to_char(col, 'hh:mi:ss.ff3 pm') display from test;

DISPLAY
---------------
10:38:33.233 pm

SQL>

如果你坚持只存储时间戳值,你将不得不使用varchar2数据类型并将值存储为字符串,这是你可能做的坏事之一。不要将日期/时间戳值存储到适当的数据库之外的任何地方。将它们存储为字符串迟早会导致问题。

相关问题