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 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
MySQL查询学习之基础查询操作
May 08 MySQL
my.ini优化mysql数据库性能的十个参数(推荐)
May 26 MySQL
mysql升级到5.7时,wordpress导数据报错1067的问题
May 27 MySQL
MYSQL 无法识别中文的永久解决方法
Jun 03 MySQL
MySQL 时间类型的选择
Jun 05 MySQL
MySQL之MyISAM存储引擎的非聚簇索引详解
Mar 03 MySQL
Mysql事务索引知识汇总
Mar 17 MySQL
MySQL RC事务隔离的实现
Mar 31 MySQL
Mysql超详细讲解死锁问题的理解
Apr 01 MySQL
mysql 排序失效
May 20 MySQL
SQLServer常见数学函数梳理总结
Aug 05 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编程之高级技巧——利用Mysql函数
2006/10/09 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
2014/07/29 PHP
PHP中feof()函数实例测试
2014/08/23 PHP
php中的字符编码转换函数用法示例
2014/10/20 PHP
浅析php原型模式
2014/11/25 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
jquery 通过name快速取值示例
2014/01/24 Javascript
学习JavaScript正则表达式
2015/11/13 Javascript
javascript每日必学之封装
2016/02/23 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
AngularJS 验证码60秒倒计时功能的实现
2017/06/05 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
vue中使用props传值的方法
2019/05/08 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
2020/12/25 Vue.js
Python实现windows下模拟按键和鼠标点击的方法
2015/03/13 Python
python基于multiprocessing的多进程创建方法
2015/06/04 Python
Python解惑之True和False详解
2017/04/24 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
python使用tkinter库实现五子棋游戏
2019/06/18 Python
Python3之不使用第三方变量,实现交换两个变量的值
2019/06/26 Python
如何将json数据转换为python数据
2020/09/04 Python
美国领先的奢侈手表在线零售商:WatchMaxx
2017/12/17 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
医务工作者先进事迹材料
2014/01/26 职场文书
中学生班主任评语
2014/01/30 职场文书
小学评语大全
2014/04/22 职场文书
小学生节约用水倡议书
2014/05/15 职场文书
英语专业毕业生求职信
2014/05/24 职场文书
在职证明书模板
2015/06/15 职场文书
婚礼父母致辞
2015/07/28 职场文书
2019年教师节祝福语精选,给老师送上真诚的祝福
2019/09/09 职场文书
使用Python解决图表与画布的间距问题
2022/04/11 Python