MySQL ISO 8601日期与时区偏移而不是Z值

时间:2013-11-14 12:16:27

标签: mysql datetime timezone offset iso8601

我需要选择ISO 8601日期。

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

这会产生类似

的东西
2013-11-13T15:47:530Z

但是我需要它而不是Z值:

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

如何使用普通MySQL进行此操作?

2 个答案:

答案 0 :(得分:3)

您需要将时区存储为DB中的额外列。我不知道任何存储日期时间 >时区/偏移量的数据库。

或者将日期存储为ISO 8601格式的字符串,并带有偏移量..

编辑:我有些纠正,有一些较新的数据库可以!

  • Postgresql Date/Time Types,确实可能包含时区。
    • 数据类型:“timestamp [(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
    • 数据类型:“TIMESTAMP WITH TIME ZONE”,存储时区偏移量。
    • 支持TIMESTAMP WITH TIME ZONE是SQL / 2008标准的可选SQL语言功能F411。
  • 似乎实际上有点标准SQL99

  • 不适用于Mysql。 5.6版。

  • 也不是SQLite。第3版。

我确实感到安慰,因为纠正来自我自己; - )

答案 1 :(得分:0)

他的片段应该适用于没有milis的iso 8601,也不支持zulu时间:

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;