日期(Date)与时间(Time)

在mysql中,与日期、时间相关的数据类型有:DATETIMEDATETIMETIMESTAMP 这4种。

基本介绍

DATE

DATE就是日期,日期就是形如YYYY-MM-DD 格式的字符串,它的范围是:1000-01-01-9999-12-31 。官网上讲,允许使用strings和numbers的值。

在测试中,发现可以有2种形式:

1
2
3
4
-- 1.strings
insert table1 values(null, '2018-7-8');
-- 2.numbers
insert table2 values(null, 20180202);

TIME

TIME就是时间,时间就是我们生活中口头上的时间了,形如:HH:MM:SS,就是小时-分钟-秒数。它不仅可以表示一天当中的具体时间,还可以表示2个时间点之间的差值。比如说,前天和今天相差了2天的时间,就是:48:00:00 的表示。同样,官网上给出了strings和numbers的可用值形式。

1
2
3
4
5
-- 1.strings
insert table2 values(null, '16:24:44');
insert table2 values(null, '124:42:33');
-- 2.numbers
insert table2 values(null, 172550);

实际上,真正的TIME的格式为:HH:MM:SS[.fraction] ,可以附带小数位,如:16:42:55.000000 ,考虑到实际中没什么用,不用特意提及。

DATETIME

DATETIME,在官网上给出的定义是:DATE和TIME的结合体。它就表示一个具体的日期+时间。格式为:YYYY-MM-DD HH:MM:SS ,范围是:1000-01-01 00:00:00-9999-12-31 23:59:59 。同样,可以使用strings和numbers的值形式。

1
2
3
4
5
6
-- 1.strings
insert table3 values(null, '2018-03-03'); # TIME省略时,TIME会自动补为0
insert table3 values(null, '2018-02-3 14:22:34');
-- 2.numbers
insert table4 values(null, 20180405); # TIME省略时,TIME会自动补为0
insert table4 values(null, 20180505152243);

实际上,真正的DATETIME的格式为:DATETIME[(fsp)]->YYYY-MM-DD HH:MM:SS[.fraction] ,fsp的值为0-6,用来限定fraction的长度。因为在实际中用不上,我们也不用关注。

TIMESTAMP

TIMESTAMP,表示时间戳。它和DATETIME有很多相似的地方。我只关注实际中切实用到的部分。首先,在插入值的语法上和DATETIEM别无二致。能使用strings和numbers的形式。完全和DATETIME的插入举例一样。其次,有一个很大的限制就是,它的范围是:1970-01-01-2038-01-19 ,在这个范围外面的时间是无效的。

至于为什么日期时间的范围有差别,这和数据类型的存储结构有关,这里不提。

实际中的用法

这里,主要讲的是在项目的设计应用中,mysql数据库所选择的日期时间的数据类型。

1、DATE

我们常用的出生日期这一列,就是典型的YYYY-MM-DD的格式。所以对于这一类的数据,我们都采用DATE。

2、TIMESTAMP

与DATE相比,TIMESTAMP还可以存储TIME部分,对于像一些操作的时间列来说,比如说登录时间、修改时间等这些操作,我们会尽可能地保存更加精确的时间。而且实际中,我们更切实的需求是最后一次的登录时间、修改时间,这也和TIMESTAMP的特性完全符合。

那DATETIME也可以做到,会不会使用DATETIME呢?答案是不会,由于储存空间的原因,DATETIME占用8个字节(8 byte),而TIMESTAMP只占用4个字节(4 byte),相同的需求功能下,我们当然选择使用TIMESTAMP。

当然,TIMESTAMP一个限制就是日期的范围,当我们需要用到2038以后的时间时,就要改用DATETIME了。

再谈TIMESTAMP和DATETIME

除了储存空间上的优势,TIMESTAMP还包含了时区的信息,在不同的时区,TIMESTAMP列显示的日期时间是不同的。当然,现在我们用不到时区,先了解一下。既然我们提到,实际生产中尽量用TIMESTAMP,那么TIMESTAMP还有哪些特性呢?

  1. 可以为null。

  2. TIMESTAMP列的默认属性。
    当我们创建一个表,包含了TIMESTAMP列时。我们再使用show create table tb_name 来查看建表语句,就会发现有趣的现象。

    1
    `last_login_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    建表语句说明:TIMESTAMP列默认是not null的,而且默认值是建表的时间,还有,当该行数据数据更新的时候,这个字段会自动更新为修改时间。

    换句话说,对于我们实际中最后一次登录时间等类似的需求,我们只需要在建表时候定义这个字段,那么以后的操作都可以不涉及这个字段了,因为它会自动更新。

对于第2个特性,如果我们想要自定义使用的话,就需要在建表语句中指明TIMESTAMP列的具体行为。下面给出几条参考语句:一般用不到。

1
2
-- 1.以后该列不自动更新(取消on update)
last_login_time timestamp default current_timestamp;
最近的文章

tomcat与nginx反向代理

一、在linux上部署运行多个tomcat1、以前的我们虽然说是在linux上,但是windows上也是同样的道理,只不过我们服务器都是选用linux罢了。 原先,自己有多个项目需要部署在linux上时,我的做法(新手的做法)是:在linux上只有一个tomcat服务器,我们把多个项目如projec …

nginx, tomcat 继续阅读
更早的文章

好用的`java.util.Objects`类

在jdk1.7中,新增了一个工具类,就是java.util.Objects类。它有3个简单的封装方法,对于平常的使用来说挺有用的,分别是:hashCode、equals、toString这3个方法。 1、hashcode生成1234567891011121314151617181920// 1. O …

java.util.Objects 继续阅读