`
骑猪逛街666
  • 浏览: 130139 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

MySQL_中你应该使用什么数据类型表示时间?

阅读更多
阅读原文请点击:http://click.aliyun.com/m/22896/
摘要: 当你需要保存日期时间数据时,一个问题来了:你应该使用 MySQL 中的什么类型?使用 MySQL 原生的 DATE 类型还是使用 INT 字段把日期和时间保存为一个纯数字呢? 在这篇文章中,我将解释 MySQL 原生的方案,并给出一个最常用数据类型的对比表。

当你需要保存日期时间数据时,一个问题来了:你应该使用 MySQL 中的什么类型?使用 MySQL 原生的 DATE 类型还是使用 INT 字段把日期和时间保存为一个纯数字呢?

在这篇文章中,我将解释 MySQL 原生的方案,并给出一个最常用数据类型的对比表。我们也将对一些典型的查询做基准测试,然后得出在给定场景下应该使用什么数据类型的结论。

如果你想直接看结论,请翻到文章最下方。

原生的 MySQL Datetime 数据类型
Datetime 数据表示一个时间点。这可以用作日志记录、物联网时间戳、日历事件数据,等等。MySQL 有两种原生的类型可以将这种信息保存在单个字段中:Datetime 和 Timestamp。MySQL 文档中是这么介绍这些数据类型的:

DATETIME 类型用于保存同时包含日期和时间两部分的值。MySQL 以 'YYYY-MM-DD HH:MM:SS' 形式接收和显示 DATETIME 类型的值。

TIMESTAMP 类型用于保存同时包含日期和时间两部分的值。

DATETIME 或 TIMESTAMP 类型的值可以在尾部包含一个毫秒部分,精确度最高到微秒(6 位数)。

TIMESTAMP 和 DATETIME 数据类型提供自动初始化和更新到当前的日期和时间的功能,只需在列的定义中设置 DEFAULT CURRENTTIMESTAMP 和 ON UPDATE CURRENTTIMESTAMP。

作为一个例子:

CREATE TABLE `datetime_example` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`measured_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `measured_on` (`measured_on`)
) ENGINE=InnoDB;
CREATE TABLE `timestamp_example` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`measured_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `measured_on` (`measured_on`)
) ENGINE=InnoDB;
除了原生的日期时间表示方法,还有另一种常用的存储日期和时间信息的方法。即使用 INT 字段保存 Unix 时间(从1970 年 1 月 1 日协调世界时(UTC)建立所经过的秒数)。

MySQL 也提供了只保存时间信息中的一部分的方式,通过使用 Date、Year 或 Time 类型。由于这篇文章是关于保存准确时间点的最佳方式的,我们没有讨论这些不那么精确的局部类型。

使用 INT 类型保存 Unix 时间
使用一个简单的 INT 列保存 Unix 时间是最普通的方法。使用 INT,你可以确保你要保存的数字可以快速、可靠地插入到表中,就像这样:

INSERT INTO `vertabelo`.`sampletable`
(
`id`,
`measured_on` ### INT 类型的列
)
VALUES
(
1,
946684801
### 至 01/01/2000 @ 12:00am (UTC) 的 UNIX 时间戳 http://unixtimestamp.com
);
这就是关于它的所有内容了。它仅仅是个简单的 INT 列,MySQL 的处理方式是这样的:在内部使用 4 个字节保存那些数据。所以如果你在这个列上使用 SELECT 你将会得到一个数字。如果你想把这个列用作日期进行比较,下面的查询并不能正确工作:

SELECT
id, measured_on, FROM_UNIXTIME(measured_on)
FROM
vertabelo.inttimestampmeasures
WHERE
measured_on > '2016-01-01' ### measured_on 会被作为字符串比较以进行查询
LIMIT 5;
这是因为 MySQL 把 INT 视为数字,而非日期。为了进行日期比较,你必须要么获取( LCTT 译注:从 1970-01-01 00:00:00)到 2016-01-01 经过的秒数,要么使用 MySQL 的 FROM_UNIXTIME() 函数把 INT 列转为 Date 类型。下面的查询展示了 FROM_UNIXTIME() 函数的用法:
阅读原文请点击:http://click.aliyun.com/m/22896/
分享到:
评论

相关推荐

    MySQL中你应该使用什么数据类型表示时间.docx

    MySQL中你应该使用什么数据类型表示时间.docx

    MySQL数据库:表的字段类型.pptx

    数据库和表的创建与管理 表的字段类型 ...表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。 每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使

    MYSQL安装包官方试用版

    对于CHAR、VARCHAR和TEXT类型,前面的表中的值L和M应解释为字符数目,并且列定义中的这些类型的长度表示字符数目。例如,要想保存一个TINYTEXT值需要L字符+ 1个字节。 要想计算用于保存具体CHAR、VARCHAR或者TEXT列...

    mysql数据库my.cnf配置文件

    #MySQL的查询缓冲大小(从4.0.1开始,MySQL提供了查询缓冲机制)使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中, # 今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户...

    MySQL 时间相关查询

    FROM_UNIXTIME() 函数可以将 MySQL 中以 INT类型存储的时间(自1970年1月1日0时0分0秒到指定时间所经过的秒数)用一种指定的格式来显示,如未指定格式则默认以年月日时分秒的形式返回。FROM_UNIXTIME(unix_timestamp,...

    mysql网络数据库指南(中文版) part1

    2.1 MySQL 数据类型 58 2.2 MySQL 的列类型 59 2.2.1 列类型概述 59 2.2.2 数值列类型 61 2.2.3 串列类型 69 2.2.4 日期和时间列类型 76 2.3 选择列的类型 81 2.3.1 列中存储何种类型的值 82 2.3.2 列值有...

    MYSQL培训经典教程(共两部分) 1/2

    4 1.1.5总结 5 1.2 关系数据库管理系统 5 1.2.1 关系数据库系统 6 1.2.2 数据库系统的发展 7 1.2.3 与数据库系统通讯 8 1.2.4 MySQL的体系结构 8 1.2.5总结 8 1.3 MYSQL使用的SQL语言 9...

    mysql数据库的基本操作语法

    如果需要改变列名建议使用change,如果需要改变数据类型和显示位置可以使用modify 13、 删除表 drop table users; drop删除表会删除表结构,表对象将不存在数据中;数据也不会存在;表内的对象也不存在,如:索引、...

    [php]mysql数据库操作——DB类

    $Rows 待查询记录条数,为0表示不限制(选填) -- 返回值:布尔 -- 实 例:$DB->Get('mydb','user,password','order by id desc',10) *******************************************************************/ ...

    MySQL如何使用时间作为判断条件

    背景:在开发过程中,我们经常需要根据时间作为判断条件来查询数据,例如:当月,当日,当前小时,几天内…… 1. 当月 我们只需要使用一个mysql的MONTH(date)函数即可实现。(注意判断年份) MONTH(date); — 用法:...

    MYSQL网络数据库PDF学习资源

    2.1 MySQL 数据类型 58 2.2 MySQL 的列类型 59 2.2.1 列类型概述 59 2.2.2 数值列类型 61 2.2.3 串列类型 69 2.2.4 日期和时间列类型 76 2.3 选择列的类型 81 2.3.1 列中存储何种类型的值 82 2.3.2 列值有特定的取值...

    mysql数据库操作

    6、修改表结构 alter table 表名 add|change|drop 列名 数据类型 7、数据修改: 1、增加数据: a: 全列插入:insert into 表名 values(0,”lin”,”yellow”,200,0) 说明:主键是不用输入的,但是全列插入时要用0...

    MYSQL培训经典教程(共两部分) 2/2

    4 1.1.5总结 5 1.2 关系数据库管理系统 5 1.2.1 关系数据库系统 6 1.2.2 数据库系统的发展 7 1.2.3 与数据库系统通讯 8 1.2.4 MySQL的体系结构 8 1.2.5总结 8 1.3 MYSQL使用的SQL语言 9...

    MySQL数据库介绍及使用

    数据类型和约束 1.数据类型 常用数据类型如下: 整数 int bit 小数 decimal 字符串 char varchar 日期时间 date time datetime 枚举类型 enum 数据类型说明: decimal表示浮点数:比如decimal(5,2)表示共存5位数,小数占...

    MYSQL实现连续签到功能断签一天从头开始(sql语句)

    1,创建测试表 CREATE TABLE `testsign` ( ... `type` int(1) DEFAULT '0' COMMENT '为0表示签到数据,1表示签到日期字典数据' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 2,插入测试数据,签到时间为

    PHP学习 mysql第1/2页

    数据类型种类 整形:可以有十进制和十六进制表示 符点形:浮点数由一个数字加一个小数点再加上一个数字组成。两个数字序列不能同时为空。 字符串:由单引号或者双引号括起来的字符或者数字,字符串中要用转义字符...

    MYSQL,SQLSERVER,ORACLE常用的函数

    SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual; A A ZERO SPACE --------- --------- --------- --------- ...

    mysql通过Navicat分区实操讲解

    mysql分区有利于管理非常大的表,mysql分区一共有四种类型,range分区,list分区, hash分区,key分区,我们通过Navicat 可视化工具来分区 1、打开Navicat 找到指定的数据库,设计表 2、打开设计表选择选项,下面有...

Global site tag (gtag.js) - Google Analytics