我有以下格式的数千个日期:
2011-10-02T23:25:42Z
(又名ISO 8601,UTC)
我应该使用什么MySQL数据类型在MySQL数据库中存储这样的ISO8601日期?例如。 Datetime
,timestamp
或其他什么?
哪个最适合比较(例如,在两个日期/时间之间获取记录)并从查询中排序结果?如果数据库非常大呢?
将上述PHP字符串转换为MySQL存储的最佳方法是什么? (我猜是会使用date_default_timezone_set('UTC');
?)
答案 0 :(得分:15)
我认为将日期时间值保存在DATETIME
类型的字段中将是一种自然的方式。
根据我自己对当前PHP应用程序的使用经验,只有read
/ write
有关此信息的操作可能会有问题。
可能的解决方案之一(假设您使用DATETIME
数据类型)来正确执行整个过程可能是以下方法:
DATETIME
字段,使用'2011-10-02T23:25:42Z'
MySQL函数DATE_FORMAT
将{<1}}形式的字符串表示形式转换为查询中的字符串表示形式格式化字符串( docs on DATE_FORMAT )'%Y-%m-%dT%H:%i:%sZ'
类对象和DateTime
静态方法{{1}格式化字符串(DateTime::createFromFormat
和'Y-m-d\TH:i:s\Z'
被转义以避免将它们视为格式化指令)( docs for the method )。T
类对象的Z
方法将PHP DateTime
类对象转换为ISO 8601的UTC格式字符串表示,其方法与之前DateTime
相同格式化字符串( documentation )。format
(带'Y-m-d\TH:i:s\Z'
格式化字符串)的参数,对数据库信息执行INSERT
/ UPDATE
操作,将其转换为真实数据库STR_TO_DATE
值( docs on STR_TO_DATE )。请在下面找到使用PDO对象的此类方法的草案示例:
'%Y-%m-%dT%H:%i:%sZ'
这种方法帮助我在PHP和MySQL数据库之间运行日期时间值。
我希望它也可能对你有所帮助。
答案 1 :(得分:9)
您可以使用DateTime
数据类型来存储日期和时间。
使用CAST
函数将此类字符串强制转换为mysql DateTime
类型。
以下是一个例子:
CAST("2011-10-02T23:25:42Z" AS DATETIME)
这将为您提供2011-10-02 23:25:42
。
希望这会对你有所帮助。
答案 2 :(得分:2)
您不能以原始UTC ISO8601格式存储日期(使用2011-10-02T23:25:42Z
表示)并保存所有SQL DATETIME功能。
但是你应该知道,MySQL(关于http://dev.mysql.com/doc/refman/5.5/en/datetime.html)总是以UTC格式存储时间/日期。 您还可以修改连接的时区 http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html
所以,如果你在PHP中执行
date_default_timezone_set('UTC');
和MySQL
SET time_zone = +00:00
确保PHP和MySQL使用UTC。
之后,您可以将所有数据库字符串转换为DateTime,而无需关心时区不匹配。
要将任何PHP DateTime(不带有其内部时区)转换为MySQL日期时间字符串,您应将DateTime对象时区设置为UTC。
$datetime->setTimezone(new DateTimeZone('UTC'))->format('Y-m-d H:i:s');
答案 3 :(得分:1)
您可以使用strtotime
的{{1}}函数轻松转换日期:
php
现在,您只需使用date_default_timezone_set('UTC');
$date = '2011-10-02T23:25:42Z';//(aka ISO 8601 in UTC)
$time = strtotime($date); //time is now equals to the timestamp
$converted = date('l, F jS Y \a\t g:ia', $time); //convert to date if you prefer, credit to Marc B for the parameters
或MySQL
在timestamp
中插入日期,具体取决于您最需要的日期。这里有关于这两种类型的最重要的事情。
<强>时间戳强>
datetime
。on update current_timestamp
不是可能的默认值NULL
进行存储,并从UTC
转换回当前时区进行检索。<强>日期时间强>
UTC
最适合比较(例如,获取两者之间的记录) 日期/时间)并从查询中排序结果?怎么样的呢 数据库非常大?
根据我之前提到的观点,那么你应该使用5.6.5
作为一个非常大的数据库,因为存储空间较小,而且索引更快,这将为你提供更好的比较性能。但是,您必须确定您的日期将符合我之前提到的timestamp
的限制,否则您别无选择,必须使用timestamp
。
datetime
的文档:http://php.net/manual/en/function.strtotime.php
并且,为了SO的回答者每天不断重复使用strtotime
已弃用的功能,请使用mysql*
或PDO
时你会做插页。
答案 4 :(得分:1)
在我的系统上使用您的日期时间PDT:
SELECT CONVERT_TZ(str_to_date('2011-10-02T23:25:42Z','%Y-%m-%dT%H:%i:%sZ'),'+00:00','SYSTEM') from dual;
2011-10-02 16:25:42
如果您的日期时间以分数微秒为单位;在Z之前添加。%f,如下所示:
SELECT CONVERT_TZ(str_to_date('2011-10-02T23:25:42.123456Z','%Y-%m-%dT%H:%i:%s.%fZ'),'+00:00','SYSTEM') from dual;
2011-10-02 16:25:42.123456
答案 5 :(得分:0)
以下是使用日期时间更好的原因。