3

我正在尝试sysdate使用转换toChar为以下格式: 2006-11-20T17:10:02+01:00

从这种格式: 16/08/2012 13:40:59

有这样做的标准方法吗?

我尝试使用toCharto 将T部分指定为字符串,但它似乎不起作用。

提前致谢

热兹平

编辑:

我已经尝试过 Nicholas 的解决方案,但是正如我上面提到的,我需要使用 sysdate。我使用了以下选择查询:

    select to_char(to_timestamp_tz(sysdate-365, 'dd/mm/yyyy hh24:mi:ss'),'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM') from dual;

但是,这会返回:

     0012-08-16T00:00:00 +01:00

这是不正确的,因为它应该是 2012-08-16T00:00:00 +01:00

4

3 回答 3

4

尝试:

 select to_char(sysdate, 'yyyy-mm-dd') || 'T' || to_char(sysdate,'hh24:mi:ss') || sessiontimezone
from dual;

返回:
2013-08-16T13:00:51+00:00

于 2013-08-16T12:57:40.710 回答
1

sysdate以包含时区信息的格式显示,您需要进行一系列转换:

  1. 使用函数转换sysdate为字符串文字。to_char()
  2. to_timestamp_tz()使用函数将字符串文字转换为带有 tome zone 的时间戳。
  3. 最后,使用 . 将最终结果转换回字符串文字to_char()

如下:

 select to_char(
                to_timestamp_tz(
                                 to_char(sysdate - 365, 'dd/mm/yyyy hh24:mi:ss')
                                , 'dd/mm/yyyy hh24:mi:ss')
                , 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM'
               ) as res
  from dual

结果:

RES
--------------------------
2012-08-16T17:29:28 +04:00

您可以在格式掩码中包含字符串文字,并用双引号将其括起来。

于 2013-08-16T13:00:14.020 回答
0

带有“T”的值称为ISO 8601,也称为“XS:DateTime”或“XSD:DateTime”或“XML Schema DateTime”。请注意,Oracle 的 sessiontimezone 命令不仅可以返回“-04:00”,还可以返回类似“America/Los_Angeles”的值(取决于数据库设置),这可能不是您想要的。由于 TZ_OFFSET 返回 \0 - 终止字符串,因此还需要替换。所以这应该工作:

create or replace function to_iso8601 (datetime_in in date) return varchar is 
begin
    return to_char(datetime_in, 'yyyy-mm-dd') || 'T' || to_char(datetime_in,'hh24:mi:ss') || replace(TZ_OFFSET(DBTIMEZONE),chr(0));
end;
/
select to_iso8601(sysdate) from dual;

结果:

2014-11-03T16:53:45-04:00
于 2014-11-03T21:55:52.337 回答