2013-11-14 3 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

Вы хотите сказать, что часовой пояс не сохраняется в объекте datetime mysql? Я хочу смещение даты и времени. – DanFromGermany

+0

Не так далеко, насколько мне известно ... (Обратите внимание, что смещение не совпадает с часовым поясом.) –

ответ

3

Вам необходимо сохранить часовой пояс в качестве дополнительного столбца в БД. Я не знаю ни одной БД, которая хранит дату и время с часовым поясом/смещением.

Или хранить дату в виде строки в ISO 8601 формат с компенсировано ..

Edit: Я стою несколько исправлен, с некоторыми новее баз данных, это возможно!

  • Postgresql Date/Time Types, который действительно может включать часовой пояс.
    • Datatype: "метка времени [(р)] с временной зоной" только для ввода и вывода, он сохраняется в формате 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
    • Datatype: "DateTimeOffset", хранит смещение часового пояса.
  • Sybase
    • Datatype: "TIMESTAMP WITH TIME ZONE", хранит смещение часового пояса.
    • Поддержка TIMESTAMP WITH TIME ZONE является необязательной функцией языка SQL F411 стандарта SQL/2008.
  • Кажется фактически несколько стандартным SQL99.

  • Не для Mysql. Версия 5.6.

  • Не для SQLite. Версия 3.

я нахожу утешение в том, что коррекция пришла от себя ;-)

0

его фрагмент должен работать на ISO 8601 без Милис, зулу время также не поддерживается:

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;