数据库中存储时间的几种类型与对比

1,835 阅读3分钟

1.字符串存储日期

相信对数据库不太了解的新手容易将时间以字符串的形式进行存储。可见,这种存储日期的方式的优点还是有的,就是简单直白,容易上手。

但是,这种做法会存在下面两个问题:

1.字符串占用的空间更大!
2.字符串存储的日期比较效率比较低(逐个字符进行比对),无法用日期相关的 API 进行计算和比较。

2.DATETIME、TIMESTAMP与时间戳对比

时间类型DATETIMETIMESTAMP时间戳
存放格式yyyy-MM-dd HH:mm:ssyyyy-MM-dd HH:mm:ss整数(int/Bigint)
时间范围“1000-00-00 00:00:00”到“9999-12-31 23:59:59”“1970-01-01 00:00:01 UTC”到“2038-01-19 03:14:07 UTC”从一个基准时间(1970-1-1 00:00:00 +0:00)到现在的秒数
存储大小8个字节4个字节4/8个字节
优点1.有一系列时间函数可以用1.有一系列时间函数可以用
2.不仅存储来日期和时间还存储来时区
1.比较时很简单,只需要比较两个树枝的大小会范围即可
2.显示问题也很容易处理,只需要根据所在时区对数值进行转换即可
缺点不能区分时区表示的时间范围有限数据库展示不直观,是一串数字

3.数据库中存储格式

a.存储格式 image.png b.获取到的格式

image.png 注:以上存储格式表示的Bigint、DataTime、TimeStamp以及Data四种类型存放在数据库中的格式,获取到的格式表示直接从数据库获取到的四种类型的时间格式。相较而言Bigint在获取之后可以更方便做转换。

4.疑问

上面展示了三种常见的数据库时间存储类型的对比,但是还有些问题;

DATETIME和TIMESTAMP的默认值?

DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间;

DATETIME和TIMESTAMP在数据库是如何存储的以及查询效率?

以上三种内部存储都是整数,对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。而对于DATETIME,不做任何改变,基本上是原样输入和输出。而时间戳不需要转换,所以查找效率int/Bigint>DATETIME>TIMESTAMP(这个排序是在对时间字段有进行操作(如通过时间范围查找或者排序等));

注:其实问题还有很多。这是笔者写项目时,对时间进行存储选择了时间戳;但是为什么要选择时间戳?便查询了些数据存储类型,以及编写Demo观察几种类型在前后端的格式。总结这篇文章应该知道选择时间戳的优点(便于比较、转换以及查询效率等),最大的问题就是不便于数据库的观察。