2013-08-16 24 views
3

我試圖使用toCharsysdate轉換爲以下格式: 2006-11-20T17:10:02+01:00使用toChar輸出W3C XML模式的xs日期:DateTime類型格式

從這個格式: 16/08/2012 13:40:59

有一個標準的做法呢?

我試過使用toChar來指定T部分作爲字符串,但它似乎不工作。

在此先感謝

Jezzipin

編輯:

我已經試過尼古拉斯的解決方案但正如我前面提到的,我需要使用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

+0

爲什麼你需要使用'sysdate'?爲什麼['systimestamp'](http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions192.htm)無法使用,因爲您需要時區信息? – user272735

回答

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

+0

謝謝。這工作完美。 – jezzipin

+0

太好了。不用謝。 – DNac

1

到包含你需要做一系列的轉換時區信息的格式顯示sysdate

  1. 轉換sysdate使用to_char()函數來字符串文字。
  2. 使用to_timestamp_tz()函數將字符串文字轉換爲帶有tome區域的時間戳。
  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 

可以包含字符串格式面膜用雙引號括起來的文字。

+0

我需要結合上面提到的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,這是不正確的。 – jezzipin

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