请帮助我在Oracle中将格式的日期时间从“2015-02-23T16:26:41.485 + 05:30”转换为“23-FEB-15 16.26.41.000000000 AM”。
我在变量中有一个ISO-8601日期字符串:
START_TIME='2015-02-23T16:26:41.485+05:30'
当我使用
时to_timestamp(START_TIME,'yyyy-mm-dd"T"hh24:mi:ss.ff3')
我明白了:
Error report:
ORA-01830: date format picture ends before converting entire input string
ORA-06512: at line 55
01830. 00000 - "date format picture ends before converting entire input string"
*Cause:
*Action:
答案 0 :(得分:0)
要将字符串转换为带有时区值的时间戳,您需要the to_timestamp_tz()
function:
select to_timestamp_tz('2015-02-23T16:26:41.485+05:30',
'yyyy-mm-dd"T"hh24:mi:ss.ff3tzh:tzm') as result
from dual;
RESULT
-----------------------------------
2015-02-23 16:26:41.485000 +05:30
这包括处理时区偏移的TZH和TZM datetime format model elements;由于这些数据类型无法理解时区,因此无法在to_timestamp()
或to_date()
中使用这些内容。
您似乎想要丢失小数秒部分和时区信息;您可以通过在小数秒精度设置为零的情况下转换为时间戳(无时区)来同时实现两者:
select cast(to_timestamp_tz('2015-02-23T16:26:41.485+05:30',
'yyyy-mm-dd"T"hh24:mi:ss.ff3tzh:tzm') as timestamp(0)) as result
from dual;
RESULT
-----------------------------------
2015-02-23 16:26:41.000000
但是,丢失时区似乎很危险,除非您确定收到的数据始终与数据库位于同一时区。如果您可能在数据中有不同的时区但由于某种原因不想保留该信息,您也可以转换为特定的时区进行存储,但目前尚不清楚您是否需要此处。如果你没有保留时区或小数秒,你可能最好还是约会。
日期和时间戳在数据库中没有任何固有格式。如果您希望看到以您指定的格式转换回字符串,请将其传递回to_char()
调用您想要的格式;但是你的例子有24小时制的小时值和(不正确的)AM / PM指标也不清楚。也许你想要:
select to_char(cast(to_timestamp_tz('2015-02-23T16:26:41.485+05:30',
'yyyy-mm-dd"T"hh24:mi:ss.ff3tzh:tzm') as timestamp(0)),
'dd-MON-rr hh:mi:ss.ff9 am') as result
from dual;
RESULT
-----------------------------------
23-FEB-15 04:26:41.000000000 PM
要将START_TIME
变量中的值存储在时间戳列中,方法完全相同,只需使用它而不是我上面用过的固定值来演示转换:
cast(to_timestamp_tz(START_TIME, 'yyyy-mm-dd"T"hh24:mi:ss.ff3tzh:tzm')
as timestamp(0))