mysql 时间字段介绍

mysql时间类型大概有5种,如下图

1、创建数据库

create table t1 (
    id  int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    d1_data date,
    d2_time time,
    d3_datatime datetime,
    d4_year year,
    d5_timestamp TIMESTAMP
);

字符串方式插入

INSERT  INTO t1 (d1_data,d2_time,d3_datatime,d4_year,d5_timestamp) VALUES(NOW(),NOW(),NOW(),NOW(),NOW());
mysql> select * from t1 where id=1\G
*************************** 1. row ***************************
          id: 1
     d1_data: 2018-06-15
     d2_time: 13:50:25
 d3_datatime: 2018-06-15 13:50:25
     d4_year: 2018
d5_timestamp: 2018-06-15 13:50:25
1 row in set (0.00 sec)

INSERT  INTO t1 (d1_data,d2_time,d3_datatime,d4_year,d5_timestamp) VALUES(‘2018-06-15‘,‘13:50:25‘,‘2018-06-15 13:50:25‘,‘2018‘,‘2018-06-15 13:50:25‘);
mysql> select * from t1 where id=2\G
*************************** 1. row ***************************
          id: 2
     d1_data: 2018-06-15
     d2_time: 13:50:25
 d3_datatime: 2018-06-15 13:50:25
     d4_year: 2018
d5_timestamp: 2018-06-15 13:50:25
1 row in set (0.00 sec)

1.1、date (数字插入)

mysql> help DATE
A date. The supported range is ‘1000-01-01‘ to ‘9999-12-31‘. MySQL
displays DATE values in ‘YYYY-MM-DD‘ format, but permits assignment of
values to DATE columns using either strings or numbers.

插入时候可以是字符串或者数字
20180615
‘2018-06-15‘

1.2、time (数字插入)

mysql> help TIME
A time. The range is ‘-838:59:59.000000‘ to ‘838:59:59.000000‘. MySQL
displays TIME values in ‘HH:MM:SS[.fraction]‘ format, but permits
assignment of values to TIME columns using either strings or numbers.

An optional fsp value in the range from 0 to 6 may be given to specify
fractional seconds precision. A value of 0 signifies that there is no
fractional part. If omitted, the default precision is 0.

mysql> INSERT  INTO t1 (d1_data,d2_time,d3_datatime,d4_year,d5_timestamp) VALUES(20180515,135025,‘2018-06-15 13:50:25‘,‘2018‘,‘2018-06-15 13:50:25‘);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t1 where id=4\G
*************************** 1. row ***************************
          id: 4
     d1_data: 2018-05-15
     d2_time: 13:50:25
 d3_datatime: 2018-06-15 13:50:25
     d4_year: 2018
d5_timestamp: 2018-06-15 13:50:25
1 row in set (0.00 sec)

1.3、 DATETIME (数字插入)

mysql> help DATETIME
A date and time combination. The supported range is ‘1000-01-01
00:00:00.000000‘ to ‘9999-12-31 23:59:59.999999‘. MySQL displays
DATETIME values in ‘YYYY-MM-DD HH:MM:SS[.fraction]‘ format, but permits
assignment of values to DATETIME columns using either strings or
numbers.

An optional fsp value in the range from 0 to 6 may be given to specify
fractional seconds precision. A value of 0 signifies that there is no
fractional part. If omitted, the default precision is 0.

Automatic initialization and updating to the current date and time for
DATETIME columns can be specified using DEFAULT and ON UPDATE column
definition clauses, as described in
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html.

20180615135025
‘2018-06-15 13:50:25‘
存储的是字符串

mysql> INSERT  INTO t1 (d1_data,d2_time,d3_datatime,d4_year,d5_timestamp) VALUES(20180515,135025,20180615135025,‘2018‘,‘2018-06-15 13:50:25‘);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1 where id=5\G
*************************** 1. row ***************************
          id: 5
     d1_data: 2018-05-15
     d2_time: 13:50:25
 d3_datatime: 2018-06-15 13:50:25
     d4_year: 2018
d5_timestamp: 2018-06-15 13:50:25
1 row in set (0.00 sec)

1.4、 year

mysql> help year
Returns the year for date, in the range 1000 to 9999, or 0 for the
"zero" date.

1.5、 timestamp (数字插入)

mysql> help timestamp
A timestamp. The range is ‘1970-01-01 00:00:01.000000‘ UTC to
‘2038-01-19 03:14:07.999999‘ UTC. TIMESTAMP values are stored as the
number of seconds since the epoch (‘1970-01-01 00:00:00‘ UTC). A
TIMESTAMP cannot represent the value ‘1970-01-01 00:00:00‘ because that
is equivalent to 0 seconds from the epoch and the value 0 is reserved
for representing ‘0000-00-00 00:00:00‘, the "zero" TIMESTAMP value.
存储的是时间戳
mysql> INSERT  INTO t1 (d1_data,d2_time,d3_datatime,d4_year,d5_timestamp) VALUES(20180515,135025,20180615135025,‘2018‘,20180615135025);
Query OK, 1 row affected (0.01 sec)

总结

以上说明 在插入或者更新时候,值可以是 ‘2018-06-06‘ 时间类型字符串 也可以是 20180606 数字,都会经过mysql函数处理存入

100w条数据 比较datatime跟timestamp效率

2、 准备100w条数据

drop PROCEDURE  autoinsert;

DELIMITER $$
create PROCEDURE autoinsert()
  BEGIN
    DECLARE i int DEFAULT 1;
    DECLARE mytime varchar(19) ;
    WHILE (i<1000000) DO
      set mytime=date_add(now(),interval i second);
      INSERT into t1  (d1_data,d2_time,d3_datatime,d4_year,d5_timestamp) VALUES (mytime,mytime,mytime,date_add(now(),interval i second),mytime);
      set i=i+1;
    END WHILE ;
  END $$
DELIMITER ;

CALL autoinsert();

2.1、datetime 分析:

没有索引情况下:


大概需要0.22s

添加索引

mysql> alter table t1 add key (d3_datatime);


2.2、timestamp分析

没有索引情况下:

需要0.4s左右

添加索引情况后:

ALTER TABLE `t1` add key (d5_timestamp);



100w条数据的理论,datetime比timestamp更快点,底层比较应该都是数字,timestamp可能在时间转换上消耗更好点吧,在加上索引情况下是没有区别的,从空间上考虑datetime需要8个字节,而timestamp只要4个字节。

原文地址:http://blog.51cto.com/marvin89/2129915

时间: 2024-10-06 04:49:45

mysql 时间字段介绍的相关文章

MySQL时间字段究竟使用INT还是DateTime

今天解析DEDECMS时发现deder的MYSQL时间字段,都是用 `senddata` int(10) unsigned NOT NULL DEFAULT '0'; 随后又在网上找到这篇文章,看来如果时间字段有参与运算,用int更好,一来检索时不用在字段上转换运算,直接用于时间比较!二来如下所述效率也更高. 归根结底:用int来代替data类型,更高效. 环境: Windows XP PHP Version 5.2.9 MySQL Server 5.1 第一步.创建一个表date_test(非

MySQL时间字段究竟使用INT还是DateTime的说明

今天解析DEDECMS时发现deder的MYSQL时间字段,都是用 `senddata` int(10) unsigned NOT NULL DEFAULT '0'; 随后又在网上找到这篇文章,看来如果时间字段有参与运算,用int更好,一来检索时不用在字段上转换运算,直接用于时间比较!二来如下所述效率也更高. 归根结底:用int来代替data类型,更高效. 环境: Windows XP PHP Version 5.2.9 MySQL Server 5.1 第一步.创建一个表date_test(非

mysql 时间字段的函数 timestamp

Mysql 里格式 时间字段的函数 DATE_FORMAT unix_timestamp - 墨墨修行的日志 - 网易博客http://jjuanxi.blog.163.com/blog/static/175274197201121011310826/

mysql时间字段转换为毫秒格式

下面是转载的关于MySQL毫秒.微秒精度时间处理的两段篇章,留给自己和供大家参考~~ 一.MySQL 获得毫秒.微秒及对毫秒.微秒的处理 MySQL 较新的版本中(MySQL 6.0.5),也还没有产生微秒的函数,now() 只能精确到秒. MySQL 中也没有存储带有毫秒.微秒的日期时间类型. 但,奇怪的是 MySQL 已经有抽取(extract)微秒的函数.例如: select microsecond('12:00:00.123456'); -- 123456 select microsec

mysql 时间字段的一些问题

MySQl中有多种表示日期和时间的数据类型.其中YEAR表示年份,DATE表示日期,TIME表示时间,DATETIME和TIMESTAMP表示日期和实践.它们的对比如下: YEAR ,字节数为1,取值范围为“1901——2155” DATE,字节数为4,取值范围为“1000-01-01——9999-12-31” TIME,字节数为3,取值范围为“-838:59:59——838:59:59” DATETIME,字节数为8,取值范围为“1000-01-01 00:00:00——9999-12-31

MySQL 常用字段类型,介绍及其建表使用方法经验分享

由于工作的公司没有专业的DBA又经常需要建立各种各种的表来满足自己的业务逻辑,所以经常查看MySQL 手册或者谷歌查看相关资料,所以本人就根据我的工作经验和相关资料来介绍一下MySQL各种字段类型及其使用.(由于本人还算是菜鸟哪里写的不对请多多指正,有兴趣的可以探讨一下) MySQL字段类型 int型包括(tinyint, smallint, mediumint, int, bigint) tinyint是1个字节表达范围就是2的8次方(-128-128) 或者(0-255) 很多人不明白为什么

MySQL基于时间字段进行分区的方案总结

MySQL支持的分区类型一共有四种:RANGE,LIST,HASH,KEY.其中,RANGE又可分为原生RANGE和RANGE COLUMNS,LIST分为原生LIST和LIST COLUMNS,HASH分为原生HASH和LINEAR HASH,KEY包含原生KEY和LINEAR HASH.关于这些分区之间的差别,改日另写文章进行阐述. 最近,碰到一个需求,要对表的时间字段(类型:datetime)基于天进行分区.于是遍历MySQL官方文档分区章节,总结如下: 实现方式 主要是以下几种: 1.

MySQL 创建表时,设置时间字段自己主动插入当前时间

MySQL 创建表时,设置时间字段自己主动插入当前时间 DROP TABLE IF EXISTS `CONTENT`; CREATE TABLE `CONTENT` ( `ID` char(20) NOT NULL, `CURRENT_TIME` timestamp not null default current_timestamp, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Mysql 升级到 5.6 后插入语句时间字段报错:Incorrect datetime value: &#39;&#39; for column &#39;createtime&#39;

今天部署服务器项目运行,当遇见有时间数据对象的插入和更新操作的时候,就报错,如下: Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '' for column 'createtime' at row 1 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2868) at com.mysql.jdbc.My