在oracle中插入时间戳

v8wbuo2f  于 2023-04-29  发布在  Oracle
关注(0)|答案(3)|浏览(299)

我试图在Oracle中插入时间戳值,但下面的查询失败。请提出相同的修复方法。我试着添加“时间戳”,但没有成功。

insert into table (name, created_date) values ('test', '2023-04-24T11:11:11.807Z');

这是我得到的例外:

SQL Error: ORA-01861: literal does not match format string
01861. 00000 -  "literal does not match format string"
*Cause:    Literals in the input must be the same length as literals in
           the format string (with the exception of leading whitespace).  If the
           "FX" modifier has been toggled on, the literal must match exactly,
           with no extra whitespace.
*Action:   Correct the format string to match the literal.
4sup72z8

4sup72z81#

'2023-04-24T11:11:11.807Z'不是TIMESTAMP数据类型,它是一个字符串文字(碰巧看起来像时间戳)。
Oracle将尝试提供帮助,并将字符串转换为适当的数据类型,这涉及到从字符串到TIMESTAMP(或TIMESTAMP WITH TIME ZONE)的隐式转换,您的查询有效地:

insert into table (
  name,
  created_date
) values (
  'test', 
  TO_TIMESTAMP(
    '2023-04-24T11:11:11.807Z',
    (SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_TIMESTAMP_FORMAT')
  )
);

但是,如果NLS_TIMESTAMP_FORMAT(或NLS_TIMESTAMP_TZ_FORMAT)会话参数与字符串的格式不匹配,则会出现异常。
你需要做的是:
1.使用TIMESTAMP文字:

insert into table (name, created_date)
values ('test', TIMESTAMP '2023-04-24 11:11:11.807 UTC');

1.如果要插入TIMESTAMP,请将TO_TIMESTAMP与显式格式模型一起使用:

insert into table (name, created_date)
values (
  'test',
  TO_TIMESTAMP( '2023-04-24T11:11:11.807Z', 'YYYY-MM-DD"T"HH24:MI:SS.FF"Z"' )
);

1.如果要插入TIMESTAMP WITH TIME ZONE,请将TO_TIMESTAMP_TZ与显式格式模型一起使用:

insert into table (name, created_date)
values (
  'test',
  TO_TIMESTAMP_TZ( '2023-04-24T11:11:11.807Z', 'YYYY-MM-DD"T"HH24:MI:SS.FFTZR' )
);

fiddle

yjghlzjz

yjghlzjz2#

不插入字符串;如果您NLS设置与您使用的格式模型匹配,则它 * 可能 * 起作用,但是-如果它们不匹配,则以不同的方式执行。例如,使用to_timestamp函数:

SQL> create table test (name varchar2(10), created_date timestamp);

Table created.

SQL> insert into test values ('test',
  2    to_timestamp('2023-04-24T11:11:11.807Z', 'yyyy-mm-dd"T"hh24:mi:ss.ff3"Z"'));

1 row created.

SQL> select * From test;

NAME       CREATED_DATE
---------- ----------------------------------------
test       24.04.23 11:11:11,807000

SQL>

另一方面,created_date建议此列应该在插入或更新时获得其值,因此您可能宁愿插入systimestamp

SQL> insert into test values ('test1', systimestamp);

1 row created.

SQL> select * From test;

NAME       CREATED_DATE
---------- ----------------------------------------
test       24.04.23 11:11:11,807000
test1      24.04.23 13:37:15,348647

SQL>
sg2wtvxw

sg2wtvxw3#

使用转换函数to_timestamp和适当的格式掩码参见 www.example.com
而且,通常,当你必须进行一些转换时(如从char到date或timestamp),使用转换函数以避免隐式转换。

相关问题