2

我需要选择一个 ISO 8601 日期。

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

这会产生类似

2013-11-13T15:47:530Z

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

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

我怎样才能用普通的 MySQL 做到这一点?

4

2 回答 2

3

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

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

编辑:我的立场有所纠正,使用一些较新的数据库是可能的!

  • Postgresql Date/Time Types,其中确实可能包括时区。
    • 数据类型:“timestamp [ (p) ] with time zone” 仅用于输入和输出,以UTC格式存储。
    • 数据类型:“带时区的时间”,只有时间,存储时区偏移量。从第 8 版开始。
  • ORACLE 日期时间数据类型和时区支持
  • 微软 SQL Server 2008
    • 数据类型:“datetimeoffset”,存储时区偏移量。
  • 赛贝斯
    • 数据类型:“TIMESTAMP WITH TIME ZONE”,存储时区偏移量。
    • 对 TIMESTAMP WITH TIME ZONE 的支持是 SQL/2008 标准的可选 SQL 语言功能 F411。
  • 似乎实际上有点标准SQL99

  • 不适用于Mysql。5.6 版。

  • 也不是SQLite。版本 3。

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

于 2014-01-14T11:17:44.733 回答
1

他的片段应该适用于没有 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;
于 2015-07-14T12:07:51.080 回答