MySQL查询日期时间


Posted in MySQL onMay 15, 2022

前言:

在项目开发中,一些业务表字段经常使用日期和时间类型,而且后续还会牵涉到这类字段的查询。关于日期及时间的查询等各类需求也很多,本篇文章简单讲讲日期及时间字段的规范化查询方法。

1.日期和时间类型概览

MySQL支持的日期和时间类型有 DATETIME、TIMESTAMP、DATE、TIME、YEAR ,

几种类型比较如下:

MySQL查询日期时间

涉及到日期和时间字段类型选择时,根据存储需求选择合适的类型即可。

2.日期和时间相关函数

处理日期和时间字段的函数有很多,有的经常会在查询中使用到,

下面介绍下几个相关函数的使用方法:

  • CURDATE 和 CURRENT_DATE 两个函数作用相同,返回当前系统的日期值。
  • CURTIME 和 CURRENT_TIME 两个函数作用相同,返回当前系统的时间值。
  • NOW() 和 SYSDATE() 两个函数作用相同,返回当前系统的日期和时间值。
  • UNIX_TIMESTAMP 获取UNIX时间戳函数,返回一个以 UNIX 时间戳为基础的无符号整数。
  • FROM_UNIXTIME 将 UNIX 时间戳转换为时间格式,与UNIX_TIMESTAMP互为反函数。
  • TO_DAYS() 提取日期值并返回自公元0年到现在的天数。
  • DAY() 获取指定日期或时间中的天值。
  • DATE() 获取指定日期或时间中的日期。
  • TIME() 获取指定日期或时间中的时间。
  • MONTH 获取指定日期中的月份。
  • WEEK 获取指定日期是一年中的第几周。
  • YEAR 获取年份。
  • QUARTER 获取日期所在的季度值。
  • DATE_ADD 和 ADDDATE 两个函数功能相同,都是向日期添加指定的时间间隔。
  • DATE_SUB 和 SUBDATE 两个函数功能相同,都是向日期减去指定的时间间隔。
  • ADDTIME 时间加法运算,在原始时间上添加指定的时间。
  • SUBTIME 时间减法运算,在原始时间上减去指定的时间。
  • DATEDIFF 获取两个日期之间间隔,返回参数 1 减去参数 2 的值。
  • DATE_FORMAT 格式化指定的日期,根据参数返回指定格式的值。

一些使用示例:

mysql> select CURRENT_DATE,CURRENT_TIME,NOW();
+--------------+--------------+---------------------+
| CURRENT_DATE | CURRENT_TIME | NOW()               |
+--------------+--------------+---------------------+
| 2020-06-03   | 15:09:37     | 2020-06-03 15:09:37 |
+--------------+--------------+---------------------+

mysql> select TO_DAYS('2020-06-03 15:09:37'),
TO_DAYS('2020-06-03')-TO_DAYS('2020-06-01');
+--------------------------------+---------------------------------------------+
| TO_DAYS('2020-06-03 15:09:37') | TO_DAYS('2020-06-03')-TO_DAYS('2020-06-01') |
+--------------------------------+---------------------------------------------+
|                         737944 |                                           2 |
+--------------------------------+---------------------------------------------+

mysql> select MONTH('2020-06-03'),WEEK('2020-06-03'),YEAR('2020-06-03');
+---------------------+--------------------+--------------------+
| MONTH('2020-06-03') | WEEK('2020-06-03') | YEAR('2020-06-03') |
+---------------------+--------------------+--------------------+
|                   6 |                 22 |               2020 |
+---------------------+--------------------+--------------------+

# DATEDIFF(date1,date2) 返回起始时间 date1 和结束时间 date2 之间的天数
mysql> SELECT DATEDIFF('2017-11-30','2017-11-29') AS COL1,
    -> DATEDIFF('2017-11-30','2017-12-15') AS col2;
+------+------+
| COL1 | col2 |
+------+------+
|    1 |  -15 |
+------+------+

3.日期和时间字段的规范查询

上面的内容都是为我们的查询需求做准备,在项目需求中,经常会以日期或时间为条件进行筛选查询。有时候这类需求多种多样,下面我们来学习下关于日期和时间字段的查询写法。

首先,为了使查询更加准确,在插入数据时也要按规范来插入。比如说年份使用4位数字,日期和月份要在合理范围内等,下面为了测试方便,我们创建一个表,并插入部分数据。

CREATE TABLE `t_date` (
`increment_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`year_col` YEAR NOT NULL  COMMENT '年',
`date_col` date NOT NULL  COMMENT '日期',
`time_col` time NOT NULL  COMMENT '时间',
`dt_col` datetime NOT NULL  COMMENT 'datetime时间',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`increment_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='time测试表';
# 日期和时间都选取当前的日期或时间
INSERT INTO t_date (year_col,date_col,time_col,dt_col,create_time) VALUES 
(year(now()),DATE(NOW()),time(now()),NOW(),NOW());
# 指定日期或时间插入
INSERT INTO t_date ( `year_col`, `date_col`, `time_col`, `dt_col`, `create_time` )
VALUES
    ( 2020, '2020-06-03', '09:00:00', '2020-06-03 10:04:04', '2020-06-03 10:04:04' ),
    ( 2020, '2020-05-10', '18:00:00', '2020-05-10 16:00:00', '2020-05-10 16:00:00' ),
    ( 2019, '2019-10-03', '16:04:04', '2019-10-03 16:00:00', '2019-10-03 16:00:00' ),
    ( 2018, '2018-06-03', '16:04:04', '2018-06-03 16:00:00', '2018-06-03 16:00:00' ),
    ( 2000, '2000-06-03', '16:04:04', '2000-06-03 08:00:00', '2000-06-03 08:00:00' ),
    ( 2008, '2008-06-03', '16:04:04', '2008-06-03 08:00:00', '2008-06-03 08:00:00' ),
    ( 1980, '1980-06-03', '16:04:04', '1980-06-03 08:00:00', '1980-06-03 08:00:00' );

根据上面测试表的数据,我们来学习下几种常见查询语句的写法:

根据日期或时间等值查询:

select * from t_date where year_col = 2020;
select * from t_date where date_col = '2020-06-03';
select * from t_date where dt_col = '2020-06-03 16:04:04';

根据日期或时间范围查询:

select * from t_date where date_col > '2018-01-01';
select * from t_date where dt_col >= '2020-05-01 00:00:00' and dt_col < '2020-05-31 23:59:59';
select * from t_date where dt_col between '2020-05-01 00:00:00' and  '2020-05-31 23:59:59';

查询本月的数据:

# 查询create_time在本月的数据
select * from t_date where DATE_FORMAT(create_time, '%Y-%m' ) = DATE_FORMAT( CURDATE( ) , '%Y-%m' );

查询最近多少天的数据:

# 以date_col为条件 查询最近7天或30天的数据
SELECT * FROM t_date where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(date_col);
SELECT * FROM t_date where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(date_col);

其他各类查询写法:

# 查询今天的数据
SELECT * FROM t_date WHERE TO_DAYS(create_time) = TO_DAYS(NOW());
# 查询某个月的数据
SELECT * FROM t_date WHERE DATE_FORMAT(create_time, '%Y-%m')='2020-06';
# 查询某年的数据
SELECT * FROM t_date WHERE DATE_FORMAT(create_time, '%Y')= 2020;
SELECT * FROM t_date WHERE YEAR(create_time) = 2020;
# 根据日期区间查询数据,并排序
SELECT * FROM t_date WHERE DATE_FORMAT(create_time, '%Y') BETWEEN '2018' AND '2020' ORDER BY create_time DESC;

总结:

本篇文章从日期和时间字段讲起,接着讲述了相关函数的使用方法,最后列举出一些常用的查询方法。希望这些内容对你有所帮助。真实情况下,某些查询可能更加复杂,特别是数据量很大时,根据时间字段查询往往会速度很慢,这时也要注意创建索引,最好能把时间字段转换为时间戳,因为整型的查询和筛选会快些。最好也要做个提醒,不要在日期和时间字段上做运算,程序能完成的事情不要在数据库层面来做。

到此这篇关于MySQL日期及时间字段的查询的文章就介绍到这了,更多相关MySQL字段查询内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
left join、inner join、right join的区别
Apr 05 MySQL
mysql的MVCC多版本并发控制的实现
Apr 14 MySQL
MySQL kill不掉线程的原因
May 07 MySQL
mysql升级到5.7时,wordpress导数据报错1067的问题
May 27 MySQL
如何自己动手写SQL执行引擎
Jun 02 MySQL
mysql left join快速转inner join的过程
Jun 30 MySQL
mysql备份策略的实现(全量备份+增量备份)
Jul 07 MySQL
MySQL多表查询机制
Mar 17 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
MySQL分布式恢复进阶
Jul 23 MySQL
分享很少见很有用的SQL功能CORRESPONDING
Aug 05 MySQL
MySQL下载安装配置详细教程 附下载资源
Sep 23 MySQL
MySQL 数据库 增删查改、克隆、外键 等操作
May 11 #MySQL
MySQL 计算连续登录天数
May 11 #MySQL
mysql 获取相邻数据项
May 11 #MySQL
MySQL脏读,幻读和不可重复读
May 11 #MySQL
MySql数据库 查询时间序列间隔
May 11 #MySQL
Mysql中常用的join连接方式
May 11 #MySQL
MySQL的prepare使用以及遇到的bug
May 11 #MySQL
You might like
PHP下MAIL的另一解决方案
2006/10/09 PHP
thinkphp自定义权限管理之名称判断方法
2017/04/01 PHP
通过Mootools 1.2来操纵HTML DOM元素
2009/09/15 Javascript
仅用[]()+!等符号就足以实现几乎任意Javascript代码
2010/03/01 Javascript
javascript开发技术大全-第3章 js数据类型
2011/07/03 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
在linux中使用包管理器安装node.js
2015/03/13 Javascript
jQuery鼠标事件汇总
2015/08/30 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
简单实现js拖拽效果
2017/07/25 Javascript
Javascript实现跨域后台设置拦截的方法详解
2017/08/04 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
Vue.js中的computed工作原理
2018/03/22 Javascript
详解如何从零开始搭建Express+Vue开发环境
2018/07/17 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
2019/05/28 Javascript
Javascript执行流程细节原理解析
2020/05/14 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
python实现的防DDoS脚本
2011/02/08 Python
python实现单向链表详解
2018/02/08 Python
python使用TensorFlow进行图像处理的方法
2018/02/28 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
初探CSS3中的calc()功能
2015/07/14 HTML / CSS
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
Under Armour安德玛意大利官网:美国高端运动科技品牌
2020/01/16 全球购物
医院工作检讨书范文
2014/02/10 职场文书
正风肃纪剖析材料
2014/02/18 职场文书
法人委托书
2014/07/31 职场文书
争做文明公民倡议书
2019/06/24 职场文书
web前端之css水平居中代码解析
2021/05/20 HTML / CSS
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python