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 相关文章推荐
MySQL安装后默认自带数据库的作用详解
Apr 27 MySQL
详解MySQL连接挂死的原因
May 18 MySQL
MySQL中出现乱码问题的终极解决宝典
May 26 MySQL
MySQL 亿级数据导入导出及迁移笔记
Jun 18 MySQL
MySQL GRANT用户授权的实现
Jun 18 MySQL
MySQL快速插入一亿测试数据
Jun 23 MySQL
使用ORM新增数据在Mysql中的操作步骤
Jul 26 MySQL
mysql5.6主从搭建以及不同步问题详解
Dec 04 MySQL
排查并解决MySQL生产库内存使用率高的报警
Apr 11 MySQL
MySQL中的全表扫描和索引树扫描
May 15 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 MySQL
MySQL 原理与优化之Update 优化
Aug 14 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
S900/ ETON E1-XM 收音机
2021/03/02 无线电
PHP 字符串正则替换函数preg_replace使用说明
2011/07/15 PHP
PHP自定义大小验证码的方法详解
2013/06/07 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
php生成RSS订阅的方法
2015/02/13 PHP
php smtp实现发送邮件功能
2017/06/22 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
JS 文件本身编码转换 图文教程
2009/10/12 Javascript
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
分享一个我自己写的ToolTip提示插件(附源码)
2013/01/20 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
web.js.字符串与正则表达式操作
2017/05/13 Javascript
如何在微信小程序中存setStorage
2019/12/13 Javascript
从Python程序中访问Java类的简单示例
2015/04/20 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
基于Python List的赋值方法
2018/06/23 Python
django orm模块中的 is_delete用法
2020/05/20 Python
python利用faker库批量生成测试数据
2020/10/15 Python
中专自荐信
2013/10/13 职场文书
会计电算化专业应届大学生求职信
2013/10/22 职场文书
活动策划求职信模板
2014/04/21 职场文书
交通安全责任书范本
2014/07/24 职场文书
2014年教师党员自我评议
2014/09/19 职场文书
2014年保管员工作总结
2014/11/18 职场文书
2014年村委会工作总结
2014/11/24 职场文书
工作失误检讨书范文
2015/01/26 职场文书
离婚被告代理词
2015/05/23 职场文书
学校证明范文
2015/06/24 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python
python爬取豆瓣电影TOP250数据
2021/05/23 Python
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
Mybatis是这样防止sql注入的
2021/12/06 Java/Android