MySQL数据类型--日期和时间类型
- 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,针对上面的例子,我们来实际操作下数据库。
- CREATE TABLE `linkinframe`.`test` (
- `id` INT NOT NULL,
- `a` YEAR NULL,
- PRIMARY KEY (`id`));
现在往该表中插入几条数据:
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', 1989);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', 1990);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', 1900);
- 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。
关于这点这里来举一个实际的例子吧。
建表语句如下:
- CREATE TABLE `linkinframe`.`test` (
- `id` INT NOT NULL,
- `a` YEAR NULL,
- PRIMARY KEY (`id`));
现在往该表中插入几条数据:
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', 0);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', 00);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', 000);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', 0000);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '0');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', '00');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', '000');
- 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类型。
建表语句如下:
- CREATE TABLE `linkinframe`.`test` (
- `id` INT NOT NULL,
- `a` TIME NULL,
- PRIMARY KEY (`id`));
现在往该表中插入几条数据:
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '1 01:50:50');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '01:50:50');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '50:05');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '1 05:05');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '59');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', '66');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', '123456');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 123456);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 0);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('10', '0');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('11', now());
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('12', current_time);
- 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中显示如下:
- 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。举个例子,
- 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类型。
建表语句如下:
- CREATE TABLE `linkinframe`.`test` (
- `id` INT NOT NULL,
- `a` DATE NULL,
- PRIMARY KEY (`id`));
现在往表中插入几条数据:
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '2008-08-08');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '20080808');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '2008@08@08');
- -- 格式出错,所以插入0000-00-00
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '2008#0808');
- -- 格式没错,但是小于了date类型的最小值1000,但是数据库还是插进去了,我晕
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '0999-08-08');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', '690808');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', '700808');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 690808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 700808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('10', '0');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('11', 0);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('12', now());
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('13', current_date);
- 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类型。
建表语句如下:
- CREATE TABLE `linkinframe`.`test` (
- `id` INT NOT NULL,
- `a` DATETIME NULL,
- PRIMARY KEY (`id`));
现在我想数据库中插入几条数据:
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '2008-08-08 08:08:08');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '20080808080808');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '2008@08@08 08*08*08');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '69-01-01 11:11:11');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '70-01-01 11:11:11');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', 20080808080808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', 690808080808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 700808080808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 0);
- 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数据类型。
建表语句如下:
- CREATE TABLE `linkinframe`.`test` (
- `id` INT NOT NULL,
- `a` TIMESTAMP NULL,
- PRIMARY KEY (`id`));
现在我们往表中插入几条数据:
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', '2008-08-08 08:08:08');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', '20080808080808');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('3', '2008@08@08 08*08*08');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('4', '69-01-01 11:11:11');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('5', '70-01-01 11:11:11');
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('6', 20080808080808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('7', 690808080808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('8', 700808080808);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('9', 0);
- 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语句如下:
- CREATE TABLE `linkinframe`.`test` (
- `id` INT NOT NULL,
- `a` TIMESTAMP NULL,
- PRIMARY KEY (`id`));
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('1', null);
- INSERT INTO `linkinframe`.`test` (`id`, `a`) VALUES ('2', 'NULL');
- 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数据类型--日期和时间类型的更多相关文章
- MySQL中日期和时间类型
1 日期类型 MySql中关于日期的类型有Date/Datetime/Timestamp三种类型. 日期赋值时,允许"不严格"语法:任何标点符都可以用做日期部分或时间部分之间的间割 ...
- MySQL中日期与时间类型
http://blog.sina.com.cn/s/blog_4d8730df01014jiy.html
- 第二章 Mysql 数据类型简介--(整数类型、浮点数类型和定点数类型,日期与时间类型,字符串类型,二进制类型)
第一节:整数类型.浮点数类型和定点数类型 1,整数类型 2,浮点数类型和定点数类型 M 表示:数据的总长度(不包括小数点):D 表示:小数位:例如 decimal(5,2) 123.45存入数据的时候 ...
- MySQL数据类型--日期时间
一.博客前言 自接触学习MySQL已有一段时间了,对于MySQL的基础知识还是略懂略懂的.在这一路学习过来,每次不管看书还是网上看的资料,对于MySQL数据类型中的时间日期类型总是一扫而过,不曾停下来 ...
- mysql的五种日期和时间类型【转载】
[mysql的五种日期和时间类型] mysql(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期 ...
- SQL Server的日期和时间类型
Sql Server使用 Date 表示日期,time表示时间,使用datetime和datetime2表示日期和时间. 1,秒的精度是指使用多少位小数表示秒 DateTime数据类型秒的精度是3,D ...
- SQL 中的日期和时间类型
在我们SQL中一般支持三种数据类型. date:日历日期,包括年(四位),月和日. time: 一天中的时间,包括小时,分和秒.可以用变量time(p)来表示秒的小数点后的数字位数(默认是0). 通过 ...
- 【MSSQL】SQL Server的日期和时间类型
参考:SQL Server的日期和时间类型 SQL Server使用 Date 表示日期,time表示时间,使用datetime和datetime2表示日期和时间. 1.秒的精度 秒的精度是指TSQL ...
- SQL Server 日期和时间类型
在Microsoft SQL Server的类型系统中,使用 date 表示日期类型,使用time表示时间类型,使用DateTime和DateTime2表示日期和时间的组合,DateTime2是Dat ...
随机推荐
- 老K漫谈区块链的共识(3)——分布式系统和区块链共识
1. 啥是分布式系统 当我们评价一个新的事物或者介绍一个新的技术的时候,我们不能架空历史和环境,新的事物不可能脱离历史和环境凭空诞生.任何新的事物和新的技术总是或多或少的,与旧的事件以及过去的技术有所 ...
- SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'Object Plans' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.
2017-11-01 09:49:44.35 spid166 SQL Server has encountered 1 occurrence(s) of cachestore flush for th ...
- ATM-简单SQL查询
use master go if exists(select * from sysDatabases where name = 'BankDB') drop database BankDB go cr ...
- Linux CFS调度器之task_tick_fair处理周期性调度器--Linux进程的管理与调度(二十九)
1. CFS如何处理周期性调度器 周期性调度器的工作由scheduler_tick函数完成(定义在kernel/sched/core.c, line 2910), 在scheduler_tick中周期 ...
- c/c++ 标准容器 forward_list resize 操作
c/c++ 标准容器 forward_list, resize, 重新定位迭代器 1,forward_list特有的方法: insert_after emplace_after erase_after ...
- Docker 入门到实践(四)Docker 使用镜像
一.获取镜像 Docker Hub 上有大量的高质量的镜像让我们获取,命令为: docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] 具体的选项可以 ...
- java学习(权限修饰符)
Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符.使用对象:类. ...
- 【项目 · Wonderland】需求规格说明书 · 终版
[项目 · Wonderland]需求规格说明书 · 终版 Part 0 · 简 要 目 录 Part 1 · 流 程 / 分 工 Part 2 · 需 求 规 格 说 明 书 Part 1 · 流 ...
- Netty中ByteBuf 的零拷贝
转载:https://www.jianshu.com/p/1d1fa2fe1ed9 此文章已同步发布在我的 segmentfault 专栏. 根据 Wiki 对 Zero-copy 的定义: &quo ...
- apache和nginx结合使用
1 有时候我们希望将nginx和apache结合起来使用,nginx接受用户的请求,作为请求转发服务器,apache作为后端服务器. 2 配置如下 nginx 中将80端口的请求转发到8000端口上 ...