【MySQL】查询今天,昨天,一段时间(日期条件)的数据

本文详细介绍了如何在MySQL中使用各种日期函数,如to_days,DATE_SUB,DATE_FORMAT,QUARTER,YEARWEEK等进行条件查询和统计,包括查询今日、昨日、近几日、本季度、上季度等日期范围的数据。

应用场景

MySQL使用日期作为条件查询或统计数据。

1.查询今天数据

select * from 表名 where to_days(时间字段名) = to_days(now());

to_days函数:返回从0000年(公元1年)至当前日期的总天数。

2.查询昨天数据

select * from 表名 where to_days(now()) - to_days(时间字段名) <= 1;

3.查询近7天的数据

select * from 表名 where date(时间字段名) >= DATE_SUB(CURDATE(), INTERVAL 7 DAY);

DATE() 函数返回日期或日期/时间表达式的日期部分。

2008-12-29 16:25:46.635 -> 2008-12-29

CURDATE() 函数返回当前的日期。

DATE_SUB() 函数从给定日期减去指定的时间间隔。

DATE_SUB(date,INTERVAL expr type)

date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。type 参数DAY,HOUR,MINUTE等。

MySQL DATE_SUB() 函数 (w3school.com.cn)

4.查询近30天的数据

select * from 表名 where date(时间字段名)>=DATE_SUB(CURDATE(), INTERVAL 30 DAY);

5.查询本月数据

select * from 表名 where DATE_FORMAT(时间字段名, '%Y%m') = DATE_FORMAT(CURDATE(), '%Y%m');

DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。

DATE_FORMAT(date,format)

date 参数是合法的日期。format 规定日期/时间的输出格式。

MySQL DATE_FORMAT() 函数 (w3school.com.cn)

6.查询上月数据

select * from 表名 where PERIOD_DIFF(DATE_FORMAT(now() , '%Y%m'), DATE_FORMAT(时间字段名, '%Y%m')) = 1;

PERIOD_DIFF() 函数返回两个周期之间的差值。

7.查询本季度数据

select * from 表名 where QUARTER(时间字段) = QUARTER(now()) AND YEAR(时间字段) = YEAR(now());

QUARTER() 函数返回给定日期值(从 1 到 4 的数字)的一年中的季度。

YEAR()函数接受date参数,并返回日期的年份。

8.查询上季度数据

select * from 表名 where QUARTER(时间字段) = QUARTER(DATE_SUB(now(),interval 1 QUARTER))AND YEAR(时间字段) = YEAR(now());

9.查询本年数据

select * from 表名 where YEAR(时间字段) = YEAR(now());

10.查询上年数据

select * from 表名 where YEAR(时间字段) = YEAR(DATE_SUB(now(), INTERVAL 1 year));

11.查询本周数据

select * from 表名 where YEARWEEK(date_format(时间字段,'%Y-%m-%d')) = YEARWEEK(now());

YEARWEEK() 函数返回给定日期的年和周数(从 0 到 53 的数字)。

YEARWEEK(date, firstdayofweek)

这里有firstdayofweek,可选。 指定一周从哪一天开始。中国习惯:1 - 一周的第一天是星期一,第一周超过 3 天

12.查询上周数据

select * from 表名 where YEARWEEK(date_format(时间字段,'%Y-%m-%d')) = YEARWEEK(now())-1;

13.查询一段时间的数据

SELECT * FROM 表名 WHERE 时间字段 BETWEEN 一段时间的开始 AND 一段时间的结束;

SELECT * FROM 表名 WHERE date_format(时间字段,'%Y-%m-%d') BETWEEN date_format(一段时间的开始,'%Y-%m-%d') AND date_format(一段时间的结束,'%Y-%m-%d')

使用BETWEEN AND 查到的时间段数据是不包含后面的边界的。可以使用DATE_SUB加一天减一秒的方式扩大后边界,或者使用TO_DAYS转换为天数。

总结:MySQL Date内置日期和时间函数

1.W3School

SQL Date 函数 (w3school.com.cn)

当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。

只要数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间,情况就有点复杂了。

在讨论日期查询的复杂性之前,我们先来看看最重要的内建日期处理函数。
在这里插入图片描述

2.mysql中文文档

MySQL 8.0 参考手册-12.7 日期和时间函数_MySQL 8.0 参考手册

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

大神笔记

mysql 统计数据查询整理,查询今日、昨日、近7天数据-优快云博客

MySQL查询特定时间段内的数据记录,通常涉及使用 `WHERE` 子句结合时间范围的条件来筛选符合条件数据。假设数据库表中有两个字段 `starttime` 和 `endtime`,并且需要查找与给定时间段 `(a, b)` 有交集的所有记录。 以下是一个通用的 SQL 查询语句,用于查出与指定时间段存在交集的数据: ```sql SELECT * FROM TABLENAME WHERE (starttime > a AND starttime < b) OR (starttime < a AND endtime > b) OR (endtime > a AND endtime < b) OR (starttime = a AND endtime = b); ``` ### 查询指定日期范围内的记录 如果仅需要查询某个具体时间段内插入或发生的记录(例如从 `'2023-01-01'` 到 `'2023-01-31'`),可以使用如下语句: ```sql SELECT * FROM TABLENAME WHERE create_time BETWEEN '2023-01-01 00:00:00' AND '2023-01-31 23:59:59'; ``` 这里假设 `create_time` 是记录创建时间的时间戳字段,通过 `BETWEEN` 操作符可以选取在这个时间段内的所有记录。 ### 查询某个月份的数据 若要查询某个月份插入的数据,例如三月份: ```sql SELECT * FROM user WHERE MONTH(create_time) = 3 ORDER BY create_time; ``` 此语句利用了 `MONTH()` 函数提取时间字段中的月份信息,并筛选出三月份的所有记录[^2]。 ### 查询结果按月分组并补零 当需要对一段时间内的数据进行按月分组统计,并且要求对于没有记录的月份显示为 0,则可以使用如下方式实现: ```sql SELECT t.mon, COALESCE(SUM(t.yData), 0) AS total FROM ( SELECT DATE_FORMAT(CREATE_TIME, '%Y%m') AS mon, COUNT(*) AS yData FROM hd_disp_prescribe_master WHERE CREATE_TIME >= '2017-01-01 00:00:00' AND CREATE_TIME <= '2017-12-31 23:59:59' AND PATIENT_ID = '3004075874' GROUP BY DATE_FORMAT(CREATE_TIME, '%Y%m') UNION ALL SELECT '201701', 0 UNION ALL SELECT '201702', 0 UNION ALL SELECT '201703', 0 -- 继续添加其他月份 ) t GROUP BY t.mon; ``` 该查询首先筛选出指定时间段和患者 ID 的记录,并按年月分组;然后通过 `UNION ALL` 添加每个月份占位符以确保即使无数据也会显示为 0,最后再对外层结果进行聚合处理[^3]。 ### 查询最近24小时、昨天、最近7天等特殊时间段的数据 针对一些特殊的时间段查询需求,如最近 24 小时、昨天、最近 7 天等,可以结合 MySQL 提供的日期函数编写查询语句。例如,查询最近 24 小时内的数据: ```sql SELECT * FROM TABLENAME WHERE visittime >= NOW() - INTERVAL 24 HOUR; ``` 查询昨天数据: ```sql SELECT * FROM TABLENAME WHERE DATE(visittime) = CURDATE() - INTERVAL 1 DAY; ``` 查询最近 7 天的数据: ```sql SELECT * FROM TABLENAME WHERE visittime >= NOW() - INTERVAL 7 DAY; ``` 这些查询利用了 `NOW()` 获取当前时间,并通过 `INTERVAL` 关键字减去相应的时间间隔来定义时间窗口[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值