在 MySQL 中处理时间


在 MySQL 中处理时间

文章插图
流行数据库系统 MySQL 的新老用户常常会对数据库处理时间值的方式感到困惑 。有时用户不会费心去了解时间值的数据类型 。这可能是因为他们觉得本身也没有什么好了解的 。日期就是日期 , 对吧?好吧 , 并非总是如此 。花几分钟时间了解 MySQL 如何存储和显示日期和时间是有益的 。学习如何最好地利用数据库表中的时间值可以帮助你成为更好的编码者 。
MySQL 时间值类型当你在 MySQL 中新建表时 , 选择合适的数据类型(INTFLOATCHAR 等)高效地保存插入到表中的数据 。MySQL 为时间值提供了五种数据类型 。它们是 DATETIMEDATETIMETIMESTAMP 和 YEAR
MySQL 使用 ISO 8601 格式来存储以下格式的值(LCTT 译注:国际标准 ISO 8601 , 是国际标准化组织的日期和时间的表示方法 , 全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》):
  • DATEYYYY-MM-DD
  • TIMEHH:MM:SS
  • TIMESTAMPYYYY-MM-DD HH:MM:SS
  • YEARYYYY
DATETIME 与 TIMESTAMP 的比较你可能已经注意到 日期时间DATETIME 和 时间戳TIMESTAMP
首先 , 可以使用的日期范围不同 。DATETIME 可以保存 1000-01-01 00:00:00 和 9999-12-31 23:59:59 之间的日期 , 而 TIMESTAMP 的范围更有限 , 从 1970-01-01 00:00:01 到 2038-01-19 03:14:07 UTC 。
其次 , 虽然两种数据类型都允许你 自动初始化auto_initialize 或 自动更新auto_update 它们各自的值(分别用 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP) , 但在 5.6.5 版本之前 , 对 DATETIME 值不能这样操作 。如果你要用 DATETIME , 你可以使用 CURRENT_TIMESTAMP 的 MySQL 同义词之一 , 例如 NOW() 或 LOCALTIME()
如果你对一个 DATETIME 值使用 ON UPDATE CURENT_TIMESTAMP(或其同义词之一) , 但没有使用 DEFAULT CURRENT_TIMESTAMP 子句 , 那么这个列的默认值为 NULL 。除非你在表的定义中包含 NOT NULL , 在这种情况下 , 它默认为 0 。
另一件需要记住的重要事情是 , 尽管通常情况下 , 除非你声明一个默认值 , 否则 DATETIME 和 TIMESTAMP 列都没有一个默认值 , 但这个规则有一个例外 。如果没有指定 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 这两个子句 , 并且禁用 explicit_defaults_for_timestamp 这个变量 , 那么你表中的第一个 TIMESTAMP 列将被隐式创建 。
要检查这个变量的状态 , 请运行:
mysql> show variables like 'explicit_default%';如果你想打开或关闭它 , 运行这段代码(用 0 表示关闭 , 用 1 表示打开):
mysql> set explicit_defaults_for_timestamp = 0;TIMEMySQL 的 时间TIME
首先要注意的是 , 虽然 TIME 经常被认为是一天中的时间 , 但它实际上是经过的时间 。换句话说 , 它可以是一个负值 , 或者可以大于 23:59:59 。在 MySQL 中 , 一个 TIME 值的范围可以是 -838:59:59 到 838:59:59 。
另外 , 如果你缩写一个时间值 , MySQL 会因你是否使用冒号作出不同解释 。例如 , 10:34 这个值被 MySQL 看作是 10:34:00 。也就是说 , 十点过后的 34 分钟 。但是 , 如果你不使用冒号写作 1034 , MySQL 将其视为 00:10:34 , 意思是 10 分钟 34 秒 。
最后 , 你应该知道 TIME 值(以及 DATETIME 和 TIMESTAMP 字段的时间部分)从 5.6.4 版本开始 , 可以取一个小数部分 。要使用它 , 请在数据类型定义的结尾处添加一个整数(最大值为 6)的圆括号 。


推荐阅读