• MySQL中的多种时间和格式数据类型

日期和时间类型是为了方便在数据库中存储日期和时间而设计的。MySQL中有多种表示日期和时间的数据类型。

其中,year类型表示时间,date类型表示日期,time类型表示时间,datetime和timestamp表示日期和时间。实际情况,最后2种使用的比较多。

具体的日期和时间类型如下:



关于上图的解释:

1,每种日期和时间类型都有一个有效范围。如果插入的值超过了这个范围,系统就会报错,并将0值插入到数据库中。

2,不同的日期与时间类型有不同的0值,上表中已经详细的列出。

  • OK,现在来仔细的整理下上面说到的几种类型:
  • year类型

year类型使用1个字节来表示年份,MySQL中以YYYY的形式来显示year类型的值。

给year类型的字段赋值的表示方法如下:

1,使用4位字符串和数字表示。其范围从1901~~2155。输入格式为'YYYY'或YYYY。举个例子,输入‘2008’或者2008,可直接保存2008。如果超过了范围,就会插入0000。

2,使用2位字符串表示。‘00’~~‘69’转换为2000~~2069,‘70’~~‘99’转换为1970~1999。举个例子,输入‘35’,year值会转换成2035,输入‘90’,year值会转换成1990。‘0’和‘00’效果一样。

3,使用2位数字表示。1~~69转换为2001~~2069,70~~99转换为1970~~1999。不举例子了,注意,2位数字和2位字符串是不一样的。如果插入0,转换后的year值不是2000,而是0000。

OK,针对上面的例子,我们来实际操作下数据库。

  1. CREATE TABLE `linkinframe`.`test` (
  2. `id` INT NOT NULL,
  3. `a` YEAR NULL,
  4. PRIMARY KEY (`id`));

现在往该表中插入几条数据:

  1. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', 1989);
  2. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', 1990);
  3. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', 1900);
  4. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', 2156);

OK,现在数据库显示如下:



year类型是使用总结:

1,顾名思义,我们一般用year类型来表示年份,所以在对该字段进行相关操作的时候,最好使用4位字符串或者数字表示,不要使用2位的字符串和数字。

2,有的时候可能会插入0或者‘0’。这里要严格区分0和‘0’,如果向year类型的字段插入0,存入该字段的年份是0000;如果向year类型的字段插入‘0’,存入的年份是2000。

当然字符串‘0’和‘00’和‘000’是一样的效果,但是‘0000’效果不一样。因为如果是4个0的话就使用了year类型赋值的第一种方式,也就是超过了year类型的范围,插入了0。

关于这点这里来举一个实际的例子吧。

建表语句如下:

  1. CREATE TABLE `linkinframe`.`test` (
  2. `id` INT NOT NULL,
  3. `a` YEAR NULL,
  4. PRIMARY KEY (`id`));

现在往该表中插入几条数据:

  1. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', 0);
  2. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', 00);
  3. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', 000);
  4. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', 0000);
  5. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '0');
  6. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', '00');
  7. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', '000');
  8. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', '0000');

OK,现在数据库显示如下:


 

  • time类型

time类型使用3个字节来表示时间。MySQL中以HH:MM:SS的形式显示Time类型的值。其中,HH表示时;MM表示分,取值范围为0~~59;SS表示秒,取值范围是0~~59。

Time类型的范围可以从‘-838:59:59’~~‘838:59:59’。虽然,小时的范围是0~~23,但是为了表示某种特殊需要的时间间隔,将Time类型的范围扩大了。而且还支持了负值。

Time类型的字段赋值的表示方法如下:

1,‘D HH:MM:SS’格式的字符串表示。其中,D表示天数,取值范围是0~~34。保存时,小时的值等于(D*24+HH)。举个例子,输入‘2 11:30:50’,Time类型会转换为59:30:50。
当然。输入时可以不严格按照这个格式,也可以是‘HH:MM:SS’,'HH:MM','D HH:MM','D HH','SS'等形式。举个例子,输入‘30’,Time类型会自动转换为00:00:30。

2,‘HHMMSS’格式的字符串或HHMMSS格式的数值表示,例如,输入‘123456’,Time类型会转换成12:34:56;输入123456,Time类型会转换成12:34:56。如果输入0或者‘0’,那么TIME类型会转换为0000:00:00。

3,使用current_time或者current_time()或者now()输入当前系统时间。

OK,现在我们来实际操作下数据库中Time类型。

建表语句如下:

  1. CREATE TABLE `linkinframe`.`test` (
  2. `id` INT NOT NULL,
  3. `a` TIME NULL,
  4. PRIMARY KEY (`id`));

现在往该表中插入几条数据:

  1. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '1 01:50:50');
  2. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '01:50:50');
  3. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '50:05');
  4. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '1 05:05');
  5. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '59');
  6. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', '66');
  7. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', '123456');
  8. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 123456);
  9. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 0);
  10. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('10', '0');
  11. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('11', now());
  12. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('12', current_time);
  13. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('13', current_time());

数据库显示如下:



关于Time类型的总结:

1,一个合法的Time值,如果超出了Time的范围,将被裁为范围最接近的端点。举个例子,‘880:00:00’将转换为838:59:59。

2,无效的Time值,在命令行下是无法被插入到表中的。举个例子,我在这里乱输入一个字符串的值,数据库取值28:00:00成功的插入进去啦,MySQL中显示如下:

  1. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('17', '1 4 4 4 4 65:65')

控制台显示如下:1
row(s) affected, 1 warning(s): 1265 Data truncated for column 'a' at
row 1。所以在使用Time类型用来存储时间的时候,最好对格式进行一下校验,不要随便的格式胡乱的输入。

3,如果插入的Time值是无效的,系统会提示报错,即使这个无效值被插入到表中了,其值也会被转换为00:00:00。举个例子,

  1. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('19', '999999');

数据库中取值00:00:00来做插入

4,Time类型专门用来存储时间数据,而且只占3个字节,所以如果只需要记录时间,选择Time类型是最合适的。

 

  • Date类型

date类型使用4个字节来表示日期。MySQL中是以YYYY-MM-DD的形式显示date类型的值。
其中,YYYY表示年,MM表示月,DD表示日。date类型的范围可以从‘1000-01-01’~~‘9999-12-31’。

给DATE类型的字段赋值的表示方法如下:

1,‘YYYY-MM-DD’或‘YYYYMMDD’格式的字符串表示,这种方式可以表达的范围是‘1000-01-01’~‘9999-12-31’。
举个例子,比如现在我输入‘4008-2-8‘,date类型将转换为4008-02-08;输入’40080308‘,date类型将转换为4008-03-08。

2,当然,MySQL中还支持一些不严格的语法格式,任何标点都可以用来做间隔符。如’YYYY/MM/DD‘,’YYYY@MM@DD‘,’YYYY.MM.DD‘等分隔形式。
举个例子,输入’2011.3.8‘,date类型将转换为2011-03-08。

3,’YY-MM-DD‘或者’YYMMDD‘格式的字符串表示,其中’YY‘的取值,’00‘~~’69‘转换为2000~~2069,’70‘~~’99‘转换为1970~~1999。与year类型类似。
举个例子,比如现在我输入’35-01-02‘,date类型将转换为2035-01-02;输入’800102‘,date类型将转换为1980-01-02。

4,同样的,MySQL中也支持一些不严格的语法格式,比如’YY/MM/DD‘,’YY@MM@DD‘,’YY.MM.DD’等分隔形式。例如,输入‘89@3@8’,date类型将转换为1989-03-08。

5,YYYYMMDD或YYMMDD格式的数字表示。其中,‘YY’的取值,‘00’~~‘69’转换为2000~~2069,‘70’~~‘99’转换为1970~~1999。与year类型类似。
举个例子,比如现在我输入20080808,date类型将转换为2008-08-08;输入790808,date类型将转换为1979-08-08;输入0,那么date类型会转化为0000-00-00。

6,使用current_date或now()来输入当前系统时间。

OK,现在我们来实际操作下数据库中的date类型。

建表语句如下:

  1. CREATE TABLE `linkinframe`.`test` (
  2. `id` INT NOT NULL,
  3. `a` DATE NULL,
  4. PRIMARY KEY (`id`));

现在往表中插入几条数据:

  1. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '2008-08-08');
  2. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '20080808');
  3. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '2008@08@08');
  4. -- 格式出错,所以插入0000-00-00
  5. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '2008#0808');
  6. -- 格式没错,但是小于了date类型的最小值1000,但是数据库还是插进去了,我晕
  7. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '0999-08-08');
  8. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', '690808');
  9. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', '700808');
  10. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 690808);
  11. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 700808);
  12. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('10', '0');
  13. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('11', 0);
  14. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('12', now());
  15. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('13', current_date);
  16. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('14', current_date());

OK,数据库显示如下:

关于date类型的总结:

1,date类型值战友4个字节,如果只需要记录日期,选择date类型是最合适的。

2,虽然MySQL支持的DATA类型的一些不严格的语法格式,但是,在实际应用中,最好还是选择标准形式。日期中使用“-”做分隔符,时间用“:”做分隔符,然后中间用空格隔开。

比如下面格式:2016-03-17 16:27:55。当然如果有特殊需要,可以使用“@”,“*”等特殊字符做分隔符。

 

  • Datetime类型

datetime类型使用8个字节来表示日期和时间。MySQL中以‘YYYY-MM-DD HH:MM:SS’的形式来显示dateTime类型的值。
从其形式上可以看出,dateTime类型可以直接用date类型和Time类型组合而成。

给dateTime类型的字段赋值的表示方法如下:

1,‘YYYY-MM-DD HH:MM:SS’或‘YYYYMMDDHHMMSS’格式的字符串表示。这种方式可以表达的范围是‘1000-01-01 00:00:00’~~‘9999-12-31 23:59:59’。
举个例子,比如我现在输入‘2008-08-08 08:08:08’,dateTime类型转换为2008-08-08 08:08:08,输入‘20080808080808’,同样转换为2008-08-08 08:08:08。

2,MySQL中还支持一些不严格的语法格式,任何的标点都可以用来做间隔符。情况与date类型相同,而且时间部分也可以使用任意的分隔符隔开,这与Time类型不同,Time类型只能用‘:’隔开呢。
举个例子,比如我现在输入‘2008@08@08 08*08*08’,数据库中dateTime类型统一转换为2008-08-08 08:08:08。

3,‘YY-MM-DD HH:MM:SS’或‘YYMMDDHHMMSS’格式的字符串表示。其中‘YY’的取值,‘00’~~‘69’转换为2000~~2069,‘70’~~‘99’转换为1970~~1999。与year型和date型相同。
举个例子,比如我现在输入‘69-01-01 11:11:11’,数据库中插入2069-01-01 11:11:11;比如我现在输入‘70-01-01 11:11:11’,数据库中插入1970-01-01 11:11:11。

4,当然这种格式化的省略YY的简写也是支持一些不严格的语法格式的,比如用‘@’,‘*’来做间隔符。

5,使用now()来输入当前系统日期和时间。

OK,现在我们来实际操作下数据库中德尔dateTime类型。

建表语句如下:

  1. CREATE TABLE `linkinframe`.`test` (
  2. `id` INT NOT NULL,
  3. `a` DATETIME NULL,
  4. PRIMARY KEY (`id`));

现在我想数据库中插入几条数据:

  1. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '2008-08-08 08:08:08');
  2. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '20080808080808');
  3. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '2008@08@08 08*08*08');
  4. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '69-01-01 11:11:11');
  5. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '70-01-01 11:11:11');
  6. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', 20080808080808);
  7. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', 690808080808);
  8. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 700808080808);
  9. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 0);
  10. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('10', now());

OK,现在数据库显示如下:

datetime类型总结:

dateTime类型用来记录日期和时间,其作用等价于date类型和Time类型的组合。一个dateTime类型的字段可以用一个date类型的字段和一个time类型的字段代替。但是如果需要同时记录日期和时间,选择dateTime类型是个不错的选择。

  • timestamp类型

timestamp类型使用4个字节来表示日期和时间。timestamp类型的范围是从1970-01-01 08:00:01~~2038-01-19 11:14:07。

MySQL中也是以‘YYYY-MM-DD HH:MM:SS’的形式显示timestamp类型的值。从其形式可以看出,timestamp类型与dateTime类型显示的格式是一样的。

给timestamp类型的字段复制的表示方法基本与dateTime类型相同。值得注意的是,timestamp类型范围比较小,没有dateTime类型的范围那么大。所以输入值时要保证在timestamp类型的有效范围内。

OK,现在我们来实际操作下数据库中timestamp数据类型。

建表语句如下:

  1. CREATE TABLE `linkinframe`.`test` (
  2. `id` INT NOT NULL,
  3. `a` TIMESTAMP NULL,
  4. PRIMARY KEY (`id`));

现在我们往表中插入几条数据:

  1. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '2008-08-08 08:08:08');
  2. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '20080808080808');
  3. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '2008@08@08 08*08*08');
  4. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '69-01-01 11:11:11');
  5. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '70-01-01 11:11:11');
  6. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', 20080808080808);
  7. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', 690808080808);
  8. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 700808080808);
  9. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 0);
  10. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('10', now());

OK,现在数据库显示如下:从数据库显示的结果来看,timestamp的范围确实很小的,2069明显的超过了2038,所以数据库插入0。

  • OK,实际使用情景中,我们使用timestamp类型和dateTime类型比较多,这里我们来对比一下

1,先来看下timestamp类型的几种与dateTime类型不同的形式内容如下:
(1.1),使用current_timestamp来输入系统当前日期与时间
(1.2),输入null时,系统会输入系统当前日期与时间
(1.3),无任何输入时,系统会输入null。
资料上面说系统会输入系统当前日期与时间,但是我自己尝试了下,如果输入null的时候,数据库中也是null,郁闷。
OK,现在我们来演示下这种情况。

建表语句和插入的sql语句如下:

  1. CREATE TABLE `linkinframe`.`test` (
  2. `id` INT NOT NULL,
  3. `a` TIMESTAMP NULL,
  4. PRIMARY KEY (`id`));
  1. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', null);
  2. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', 'NULL');
  3. INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', current_timestamp());

数据库显示如下:


2,timestamp类型还有一个很大的特殊点,就是时间是根据时区来显示的。例如,在东八区插入的timestamp类型为2009-09-30 14:21:25,在东七区显示时,时间部门就变成了13:21:25,在东九区显示时,时间部门就变成了15:21:25。

3,需要显示日期与时间,timestamp类型能够根据不同地区的时区来转换时间,但是,timestamp类型的范围太小,其最大时间为2038-01-19 11:14:07。
如果插入时间的比这个大,将会出错,我自己实际操作中,数据库插入0000-00-00 00:00:00。所以需要的时间范围比较大,还是选择dateTime类型比较安全。

MySQL数据类型--日期和时间类型的更多相关文章

  1. MySQL中日期和时间类型

    1 日期类型 MySql中关于日期的类型有Date/Datetime/Timestamp三种类型. 日期赋值时,允许"不严格"语法:任何标点符都可以用做日期部分或时间部分之间的间割 ...

  2. MySQL中日期与时间类型

    http://blog.sina.com.cn/s/blog_4d8730df01014jiy.html

  3. 第二章 Mysql 数据类型简介--(整数类型、浮点数类型和定点数类型,日期与时间类型,字符串类型,二进制类型)

    第一节:整数类型.浮点数类型和定点数类型 1,整数类型 2,浮点数类型和定点数类型 M 表示:数据的总长度(不包括小数点):D 表示:小数位:例如 decimal(5,2) 123.45存入数据的时候 ...

  4. MySQL数据类型--日期时间

    一.博客前言 自接触学习MySQL已有一段时间了,对于MySQL的基础知识还是略懂略懂的.在这一路学习过来,每次不管看书还是网上看的资料,对于MySQL数据类型中的时间日期类型总是一扫而过,不曾停下来 ...

  5. mysql的五种日期和时间类型【转载】

    [mysql的五种日期和时间类型] mysql(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期 ...

  6. SQL Server的日期和时间类型

    Sql Server使用 Date 表示日期,time表示时间,使用datetime和datetime2表示日期和时间. 1,秒的精度是指使用多少位小数表示秒 DateTime数据类型秒的精度是3,D ...

  7. SQL 中的日期和时间类型

    在我们SQL中一般支持三种数据类型. date:日历日期,包括年(四位),月和日. time: 一天中的时间,包括小时,分和秒.可以用变量time(p)来表示秒的小数点后的数字位数(默认是0). 通过 ...

  8. 【MSSQL】SQL Server的日期和时间类型

    参考:SQL Server的日期和时间类型 SQL Server使用 Date 表示日期,time表示时间,使用datetime和datetime2表示日期和时间. 1.秒的精度 秒的精度是指TSQL ...

  9. SQL Server 日期和时间类型

    在Microsoft SQL Server的类型系统中,使用 date 表示日期类型,使用time表示时间类型,使用DateTime和DateTime2表示日期和时间的组合,DateTime2是Dat ...

随机推荐

  1. UGUI自定义组件之Image根据Text大小自动调整

    需求分析 在之前的文章中,介绍到可以使用UGUI自带的ContentSizeFitter组件,进行Button根据Text的长度自适应, UGUI ContentSizeFitter之Button根据 ...

  2. March 11th, 2018 Week 11th Sunday

    All good things must come to an end. 好景无常. Love is when the other person's happiness is more importa ...

  3. Ant Design Pro的dva-loading

    loading为dva的插件,全局可用,它里面维护了一些布尔值,用于控制loading动画效果的显示与隐藏,通过@connect()来注入使用 官网介绍如下: https://dvajs.com/ 在 ...

  4. ElasticSearch(四):使用Java连接ElasticSearch集群

    public class ESIndexMapping { private static String host="192.168.56.3"; // 服务器地址 private ...

  5. centos7下安装docker(13.4容器volume总结)

    最近我们学习了docker 存储,首先docker存储有两种:storage driver和data volume. storage driver是由镜像层和容器层组成的,可以通过docker ins ...

  6. [TJOI2017]城市

    嘟嘟嘟 这题刚开始想复杂了,想什么dp去了,其实没那么难. 考虑断掉一条边,记分离出来的两棵子树为A和B,那么合并后的树的直径可能有三种情况: 1.A的直径. 2.B的直径 3.A的半径+边权+B的半 ...

  7. range()函数

    range()函数 函数说明: range(start, stop[, step]) -> range object,根据start与stop指定的范围以及step设定的步长,生成一个序列.参数 ...

  8. Windows解压安装mysql 5.7.24,并部署多个mysql服务

    mysql官网windows安装文档 https://dev.mysql.com/doc/refman/5.7/en/windows-installation.html 第一步,选择安装包   htt ...

  9. 给大家推荐一个C#下的Ribbon风格的Forms实现示例-含源码

    C#下的Ribbon风格的Forms实现示例:源码下载地址

  10. 洛谷 P1451 求细胞数量

    题目链接 https://www.luogu.org/problemnew/show/P1451 题目描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字 ...