使用 toChar 以 W3C XML Schema xs:dateTime 类型格式输出日期
Posted
技术标签:
【中文标题】使用 toChar 以 W3C XML Schema xs:dateTime 类型格式输出日期【英文标题】:Using toChar to output a date in W3C XML Schema xs:dateTime type format 【发布时间】:2013-08-16 12:47:03 【问题描述】:我正在尝试使用toChar
将sysdate
转换为以下格式:
2006-11-20T17:10:02+01:00
从这种格式:
16/08/2012 13:40:59
有这样做的标准方法吗?
我尝试使用toChar
将T
部分指定为字符串,但它似乎不起作用。
提前致谢
Jezzipin
编辑:
我已经尝试过 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
【问题讨论】:
为什么需要使用sysdate
?为什么systimestamp
不能用于您需要时区信息?
【参考方案1】:
试试:
select to_char(sysdate, 'yyyy-mm-dd') || 'T' || to_char(sysdate,'hh24:mi:ss') || sessiontimezone
from dual;
返回: 2013-08-16T13:00:51+00:00
【讨论】:
【参考方案2】:要以包含时区信息的格式显示sysdate
,您需要进行一系列转换:
-
使用
to_char()
函数将sysdate
转换为字符串字面量。
使用to_timestamp_tz()
函数将字符串文字转换为带有tome zone 的时间戳。
最后,使用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
您可以在格式掩码中包含字符串文字,并用双引号将其括起来。
【讨论】:
我需要将它与上面提到的 sysdate 结合使用。因此,我做了以下事情: select to_char(to_timestamp_tz(sysdate-365, 'dd/mm/yyyy hh24:mi:ss'),'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM')从双;但是这会返回 0012-08-16T00:00:00 +01:00 这是不正确的。【参考方案3】:带有“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
【讨论】:
以上是关于使用 toChar 以 W3C XML Schema xs:dateTime 类型格式输出日期的主要内容,如果未能解决你的问题,请参考以下文章
Oracle日期格式转换,tochar(),todate()