mysql 时间字段介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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=1G
*************************** 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=2G
*************************** 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=4G
*************************** 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=5G
*************************** 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个字节。

以上是关于mysql 时间字段介绍的主要内容,如果未能解决你的问题,请参考以下文章

Laravel统计Mysql 单个字段不同值的数量

mysql怎么获取数据表字段enum类型的默认值

mysql 时间字段介绍

MySQL字段属性介绍

从mysql的片段中加载ListView

部分代码片段