我对 MySQL 数据库中日期和时间的选择感到困惑。是否有一份备忘单可以为我提供基础知识并总结选择?
我欢迎技术更正,但请记住,这并不意味着作为参考。这是一个摘要备忘单。
DATE
支持范围从“1000-01-01”到“9999-12-31”。
以 YYY-MM-DD 格式存储为字符串。
DATETIME
支持范围从“1000-01-01 00:00:00”到“9999-12-31 23:59:59”。
以 YYYY-MM-DD HH:MM:SS 格式存储为字符串。
代表日历上的日期和挂钟上的时间。创建或更新记录时它永远不会改变。它永远不会根据服务器的时区而改变。可以做从 1000 年到 9999 年的日期。
TIMESTAMP
支持范围从 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC
不能做早于 1970 年的日期,因此不能用于生日。
以 YYYY-MM-DD HH:MM:SS 格式存储为字符串。
时间戳是一个独特的时间点。在 MySQL 中,它通常用于跟踪记录的更改,并且可以设置为在创建和/或更新记录时自动更新。
MySQL 根据服务器的时区转换 TIMESTAMP 值。它被转换为 UTC(协调世界时)进行存储,然后再次返回到服务器的时区进行检索。
UNIX TIMESTAMP
UTC 自 1970 年 1 月 1 日以来调整的秒数,存储为带符号的 32 位整数。
当发生闰秒时,UTC 日期不完全是 86400 秒,Unix 时间编号就会出现不连续性。
这些存储在 MySQL 的“整数”列中,内部存储为 32 位。
MySQL 日期函数
MySQL 日期和时间格式是字符串,而不是整数。
FROM_UNIXTIME(timestamp) 将 unix 时间戳格式化为字符串
UNIX_TIMESTAMP(mysqldate) 将 MySQL 字符串转换为 unix 时间戳
PHP 日期函数
PHP 日期函数使用 unix 时间戳,即整数。
string date( string $format, int $timestamp) 从 unix 时间戳返回 MySQL 字符串
int strtotime( string $mysqldate) 从 MySQL 字符串返回 unix 时间戳
处理不兼容的日期时间格式的方法:
PHP 将 unix 时间戳转换为 MySQL 字符串:
$mysqldate = date( 'Y-m-d H:i:s', $timestamp );
PHP 将 MySQL 字符串转换为 unix 时间戳:
$timestamp = strtotime( $mysqldate );
MySQL 将 unix 时间戳转换为 MySQL 字符串:
$query = "UPDATE table SET mysqldatetimefield = FROM_UNIXTIME($timestamp);
MySQL 将 MySQL 字符串转换为 unix 时间戳:
$query = "SELECT UNIX_TIMESTAMP(mysqldate) FROM table;
在 MySQL 整数列中存储 unix 时间戳:
mysql> CREATE TABLE table ( timestamp INTEGER, PRIMARY KEY (timestamp) );
mysql> INSERT INTO table(timestamp) VALUES (1358402400)