在我的Oracle数据库中,我有一个date列,其数据类型为Date。 我想将输入字符串值-'2020-09-1015:45:59 + 10:00'存储到我的日期列中。我也不想忽略时区值。
请告知查询/条款。
谢谢
答案 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 |