如何将字符串'2020-09-1015:45:59 + 10:00'存储到日期列

时间:2020-09-10 08:54:59

标签: sql string oracle datetime

在我的Oracle数据库中,我有一个date列,其数据类型为Date。 我想将输入字符串值-'2020-09-1015:45:59 + 10:00'存储到我的日期列中。我也不想忽略时区值。

请告知查询/条款。

谢谢

2 个答案:

答案 0 :(得分:1)

DATE列没有时区;因此,如果要将值2020-09-1015:45:59+10:00存储在DATE列中,则无法存储时区,因此要使值一致,则需要将值转换为已知时区(通常是是UTC + 0):

INSERT INTO your_table ( your_date_column )
VALUES (
  CAST(
    TO_TIMESTAMP_TZ(
      '2020-09-10 15:45:59+10:00',
      'YYYY-MM-DDHH24:MI:SSTZH:TZM'
    ) AT TIME ZONE 'UTC'
    AS DATE
  )
)

将哪个值存储在UTC时区:

SELECT * FROM your_table;
| YOUR_DATE_COLUMN    |
| :------------------ |
| 2020-09-10T05:45:59 |

如果您也要存储TIME ZONE数据,则不能使用DATE列,而应使用TIMESTAMP WITH TIME ZONE数据类型:

CREATE TABLE your_table ( your_date_column TIMESTAMP WITH TIME ZONE )

,您可以这样插入:

INSERT INTO your_table ( your_date_column )
VALUES (
  TO_TIMESTAMP_TZ(
    '2020-09-10 15:45:59+10:00',
    'YYYY-MM-DDHH24:MI:SSTZH:TZM'
  )
)

然后:

SELECT * FROM your_table;

输出:

| YOUR_DATE_COLUMN                    |
| :---------------------------------- |
| 2020-09-10T15:45:59.000000000+10:00 |

db <>提琴here

答案 1 :(得分:0)

首先,如果要存储时区,则需要数据类型timestamp with time zone

create table t (ts timestamp with time_zone);

如果您想直接提供一个字符串,一种选择是将该数据类型的nls格式更改为您的格式:

alter session set nls_timestamp__tz_format = 'yyyy-mm-ddhh24:mi:ss tzr';

然后,您可以直接将字符串传递给insert,并依靠Oracle的隐式转换将其转换为时间戳:

insert into t values('2020-09-1015:45:59+10:00');

因此,当您select该列时,您将获得配置格式的字符串:

select * from t;
| TS                        |
| :------------------------ |
| 2020-09-1015:45:59 +10:00 |

Demo on DB Fiddle