2013-11-14 27 views
0

我需要選擇ISO 8601日期。MySQL ISO 8601帶時區偏移量而不是Z值的日期

DATE_FORMAT(date, '%Y-%m-%dT%TZ') 

這將產生類似

2013-11-13T15:47:530Z 

但我需要它的偏移,而不是Z值:

2013-11-13T15:47:53+02:00 

我怎樣才能做到這一點與普通的MySQL?

+0

你怎麼知道你想指定哪個偏移量? –

+0

你的意思是時區不會保存在mysql datetime對象中? 我想要的日期時間的偏移量.. – DanFromGermany

+0

不我所知...(注意,一個偏移量是不是真的與時區相同) –

回答

3

您需要將時區作爲額外的列存儲在數據庫中。我不知道任何存儲datetime 時區/偏移量的數據庫。

或日期存儲爲字符串中的ISO 8601格式偏移..

編輯:我站在有點糾正,一些較新的數據庫它是可能的!

  • Postgresql Date/Time Types,其確實可能包括時區。
    • 數據類型: 「時間戳[(P)]與時區」 僅輸入和輸出,它被存儲在UTC。
    • 數據類型:「帶時區的時間」,只有時間,存儲時區偏移量。 自版本8起。
  • ORACLE Datetime Datatypes and Time Zone Support
    • 數據類型:「TIMESTAMP WITH TIME ZONE」,存儲時區偏移量。 自9i版本起。
    • 數據類型:「TIMESTAMP WITH TIME ZONE」,存儲時區偏移或時區名稱。 從版本10g開始。
    • 另請參閱Oracle TIMESTAMP WITH TIMEZONE named zone vs offset
  • MicroSoft SQL Server 2008
    • 數據類型: 「DATETIMEOFFSET」,商店區偏移量。
  • Sybase
    • 數據類型: 「WITH TIME ZONE TIMESTAMP」,商店區偏移量。
    • 支持TIMESTAMP WITH TIME ZONE是SQL/2008標準的可選SQL語言功能F411。
  • 似乎實際上有點標準SQL99

  • 不適用於Mysql。版本5.6。

  • 也適用於SQLite。版本3

我確實覺得是,校正從我來到這個事實安慰;-)

0

他的段應爲ISO 8601的工作沒有milis,也不支持祖魯時間:

select IF(
LENGTH(value) < 23, 
STR_TO_DATE(value,'%Y-%m-%dT%TZ'), 
CASE SUBSTRING(value from 20 for 1) 
WHEN '+' THEN 
DATE_ADD(
STR_TO_DATE(SUBSTRING(value from 1 for 19),'%Y-%m-%dT%TZ'), 
INTERVAL SUBSTRING(value from 21 for 2) HOUR) 
WHEN '-' THEN 
DATE_SUB(
STR_TO_DATE(SUBSTRING(value from 1 for 19),'%Y-%m-%dT%TZ'), 
INTERVAL SUBSTRING(value from 21 for 2) HOUR 
) 
END 
) 
from THE_NAMESPACE.THE_TABLE.THE_COLUMN as value; 
相關問題