MySQL 日期类型函数及使用
1 MySQL 数据库中有五种与日期时间有关的数据类型,各种日期数据类型所占空间如下图所示:

2 datetime 与 date
datetime 占用8字节,是占用空间最多的一种日期格式。它显示日期,同时也显示时间。5.5及以前的版本不支持微妙级别,任何微妙数值都会被截断之后存入数据库。
date 占用3字节,仅仅显示日期。
3 timestamp
timestamp 与 datetime 显示的结果是一样的,不同的是timestamp 占用4个字节。它的显示范围是:1970-01-01 00:00:01 至 2038-01-19 01:14:07(UTC),UTC 协调世界时间,世界统一时间。
timestamp 与 datetime显示的格式一样,但是显示的范围不同,还有以下一些区别
- 建表时, 列为timestamp的类型可以设置一个默认值,datetime 不行。
- 更新表时,可以设置timestamp 类型的列自动更新时间为当前时间。
4 year 与 time
year 类型占用1字节,在定义时可以显示指定宽度为year(4)或者year(2)。对于year(4),其显示的年份范围为 1901 ~ 2155;对于year(2),其显示的年份范围为:1970~2070。
在year(2)的设置下,00~69 代表 2000~2069。
time 类型占用3字节,显示的范围 -838:59:59 ~ 838:59:59。time 类型时间大于23或者为负数时用来表示时间间隔。
5 时间与日期函数
5.1 系统时间函数 now(), current_timestamp, sysdate()
这三个函数都能返回系统时间,看看它们的区别,同时访问这三个函数得到的结果一样,但是让其等待几秒之后,结果就不同了。

上图发现sysdate()返回的时间与now(), current_timestamp不同,慢了2秒,原因如下:
current_timestamp 是now的同义词,两者实际上是一样的;
sysdate() 函数返回的是执行到当前函数时的时间,而now()返回的是执行sql语句时的时间;
5.2 时间加减函数
① date_add 与 date_sub
date_add(date, interval expr unit) 与 date_sub(date, interval expr unit) 分别表示增加与减少。
select
date_add('2017-12-18 22:51:00', interval 1 second),
date_add('2017-12-18 22:51:00', interval 1 minute),
date_add('2017-12-18 22:51:00', interval 1 hour),
date_add('2017-12-18 22:51:00', interval 1 day),
date_add('2017-12-18 22:51:00', interval 1 month),
date_add('2017-12-18 22:51:00', interval 1 year);
遇到闰月时,date_add怎么处理呢,MySQL如果是闰月返回的日期为2月29,如果不是闰月返回的是2月28。
select date_add('2016-02-29 22:51:00', interval -1 year),
date_add('2016-02-29 22:51:00', interval 4 year);
2015-02-28 22:51:00 2020-02-29 22:51:00
② datediff 与 timediff
datediff(date1,date2):两个日期相减 date1 - date2,返回天数。select datediff('2016-02-29 22:51:00','2016-03-29 22:51:00');
timediff(time1,time2):两个日期相减 time1 - time2,返回 time 差值(格式为:838:59:59)。select timediff('2016-02-29 22:51:00','2016-01-29 22:51:00');
注意:timediff(time1,time2) 函数的两个参数类型必须相同。
③ timestamp 增,减,转换函数
timestamp(date) -- date to timestamp
timestamp(date, time) -- date + time
timestampadd(unit,interval,datetime_expr) -- 类似date_add,对时间按单位进行增加,减少
select timestampadd(second, 60, '2017-12-18 00:00:00');
select timestampadd(minute, 60, '2017-12-18 00:00:00');
select timestampadd(hour, 60, '2017-12-18 00:00:00');
timestampdiff(unit,datetime_expr1,datetime_expr2) --计算两个时间的差,可以计算秒,分,时,天,月,年,周
select timestampdiff(second, '2017-12-18 00:00:00','2017-12-18 12:00:00');
select timestampdiff(hour, '2017-11-18 00:00:00','2017-12-18 12:00:00');
select timestampdiff(day, '2017-10-17 00:00:00','2017-11-18 23:00:00');
④ date_format 函数
date_format 函数主要用途是格式化日期
select date_format(now(),'%Y%m%d'),
date_format(now(),'%Y-%m-%d'),
date_format(now(),'%Y/%m/%d'),
date_format(now(),'%m/%d/%Y');
注意:查询数据时如果对某个日期字段使用这个函数,则优化器不会使用字段的索引,也不能通过索引来查询数据,因此查询效率会很低,如下列查询语句,如果字段birth_date有索引,则该索引因为使用了date_format函数失效:
select *
from employees
where date_format(birth_date,'%Y-%m-%d') = '1961-08-03';
6 日期的经典编程问题
根据某个用户的出生日期与当前日期,计算他最近的生日(包括已经过去的和将来的)
-- 上一年,当年,下一年生日与当前时间差最小的年就是用户最近的生日
select emp_no,first_name,last_name,birth_date,today,if(last_diff<=cur_diff and last_diff<=next_diff, last,if(cur_diff<last_diff and cur_diff<next_diff, cur, next) ) as latest_birth
from
(
-- 计算当前时间与上一年,当年,下一年生日的时间差
select emp_no,first_name,last_name,birth_date,datediff(today,last) as last_diff,abs(datediff(today,cur)) as cur_diff,abs(datediff(today,next)) as next_diff,
last,cur,next,today
from
(
-- 用户最近的生日可能分布在前一年,当年,下一年。根据年度差year_diff计算上一年,当年,下一年用户的生日
select emp_no,first_name,last_name,birth_date,
DATE_ADD(birth_date,INTERVAL year_diff year) as cur,
DATE_ADD(birth_date,INTERVAL year_diff+1 year) as next,
DATE_ADD(birth_date,INTERVAL year_diff-1 year) as last,
today
from
(
-- 获取当前事前与出生日期的年度差 year_diff
select emp_no,first_name,last_name,birth_date,(year(NOW())-year(birth_date)) as year_diff, NOW() as today
from employees
) a
) b
) c
MySQL 日期类型函数及使用的更多相关文章
- mysql 日期类型比较
MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型 存储空间 日期格式 日期范围 ------------ ------ ...
- 转 MySQL 日期类型详解
MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型 存储空间 日期格式 日期范围 ------------ ---- ...
- MySQL 日期类型及默认设置 (除timestamp类型外,系统不支持其它时间类型字段设置默认值)
MySQL 日期类型及默认设置 之前在用 MySQL 新建 table,创建日期类型列时遇到了一些问题,现在整理下来以供参考. MySQL 的日期类型如何设置当前时间为其默认值? 答:请使用 time ...
- Mysql日期转换函数、时间转换函数
Mysql日期转换函数.时间转换函数 一.MySQL 获得当前日期时间 函数 1,获得当前日期+时间(date + time)函数:now(): select now(); 结果: :: 2,获得当前 ...
- MySQL日期时间函数大全(转)
MySQL日期时间函数大全 DAYOFWEEK(date) 返回日期date是星期几(1=星期天,2=星期一,……7=星期六,ODBC标准)mysql> select DAYOFWEEK('1 ...
- 【转】MySQL日期时间函数大全
MySQL日期时间函数大全 1.DAYOFWEEK(date) 返回日期date是星期几(1=星期天,2=星期一,……7=星期六,ODBC标准)mysql> select DAYOFWEEK( ...
- java mysql 日期类型
mysql(版本:5.1.50)的时间日期类型如下: datetime 8bytes xxxx-xx-xx xx:xx:xx 1000-01-01 00:00:00到9999-12-31 23:59: ...
- mysql日期时间函数2
win7可以设定每周从哪一天开始,win2003等不能方便的修改.有的是周日开始,有的是周一开始.而工作中有的时候每周是从周六开始算的,有些数据需要按周统计,那么那种方式比较好呢? 通过下面的研究 ...
- MySQL 日期时间函数
目录 datetime和timestamp区别: timestamp类型字段特殊性: Mysql获取日期时间函数: now() curdate() curtime() Extract() last_d ...
随机推荐
- MySQL高级知识(十六)——小表驱动大表
前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里.在查询的优化中永远小表驱动大表. 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5 ...
- Java学习笔记(三)——封装、继承、多态
一.封装 概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 实现步骤: 修改属性的可见性——设为private. 创建getter/se ...
- 使用chrome远程调试设备及调试模拟器设备
使用chrome开发工具远程在Android上远程调试 准备工作 开始远程调试之前,需要做好如下准备: 在你电脑上安装Chrome 32 或者更新的版本 一根连接Android设备的USB线 手机系统 ...
- C#定时备份正在播放的幻灯片、word文档、excel电子表格,mht格式文档
控制台应用, 代码如下: using System; using System.Collections.Generic; using System.IO; using System.Linq; usi ...
- [matlab] 8.蚁群算法解决TSP问题
城市坐标数据下载 密码:07d5 求遍历这52座城市后最后回到最初城市的最短距离 %% 第9章 蚁群算法及MATLAB实现——TSP问题 % 程序9-1 %% 数据准备 % 清空环境变量 clear ...
- ASP.NET Core 2.1 源码学习之 Options[1]:Configure
配置的本质就是字符串的键值对,但是对于面向对象语言来说,能使用强类型的配置是何等的爽哉! 目录 ASP.NET Core 配置系统 强类型的 Options Configure 方法 Configur ...
- Android开发常用权限设置
加在AndroidManifest.xml 文件中manifest标签以内,application以外 例如:<!--网络权限 --> <uses-permission androi ...
- 【Python入门只需20分钟】从安装到数据抓取、存储原来这么简单
基于大众对Python的大肆吹捧和赞赏,作为一名Java从业人员,我本着批判与好奇的心态买了本python方面的书<毫无障碍学Python>.仅仅看了书前面一小部分的我......决定做一 ...
- 如何写出没有BUG的代码
1947年9月9日,美国海军准将 Grace Hopper 在哈佛学院计算机实验室里使用 Mark II 和 Mark III 计算机进行研究工作.她的团队跟踪到 Mark II 上的一个错误,操作人 ...
- 一篇 JPA 总结
概述 下面是 JDBC 在 Java 应用和数据库之间的位置,充当着一个中间者,供 Java 应用程序访问所有类别的数据库,建立一个标准 JPA 如同 JDBC 一样,为 Java 应用程序使用 OR ...