MySQL 怎样查询今日、昨日、近7日、上周、本月数据?

本文将介绍在 MySQL 中怎样查询今日、昨日、近7日、上周、本月数据?

本文以 MySQL 5.7 为例,事先创建一张 t_uuid_data 的数据表,表结构如下:

CREATE TABLE `t_uuid_data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uuid` varchar(50) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

创建一个存储过程 generator_data,使用该过程生成数据。过程代码:

CREATE DEFINER=`root`@`%` PROCEDURE `generator_data`()
BEGIN
    #Routine body goes here...
    DECLARE i INT DEFAULT 0;
    DECLARE UUID VARCHAR(50) DEFAULT '';
    simple_loop: LOOP
        SET i = i + 1;
        
        SELECT REPLACE(RAND(),'.','') INTO UUID;
        
        INSERT INTO `t_uuid_data`(`uuid`, `create_date`) 
            VALUES (UUID, DATE_SUB(CURDATE(), INTERVAL i DAY));
            
        IF i = 1000 THEN
            LEAVE simple_loop;
        END IF;
    END LOOP simple_loop;
END

调用存储过程:

call generator_data();

示例数据如下:

INSERT INTO `t_uuid_data`(`id`, `uuid`, `create_date`) VALUES (10179, '02008538322531188', '2022-08-12 00:00:00');
INSERT INTO `t_uuid_data`(`id`, `uuid`, `create_date`) VALUES (10180, '0471891535885531', '2022-08-11 00:00:00');
INSERT INTO `t_uuid_data`(`id`, `uuid`, `create_date`) VALUES (10181, '07568962134019437', '2022-08-10 00:00:00');
INSERT INTO `t_uuid_data`(`id`, `uuid`, `create_date`) VALUES (10182, '036880649008677013', '2022-08-09 00:00:00');
-- ... more ...

示例

(1)查询5分钟前的数据

select * from t_uuid_data where create_date between date_add(now(), interval -300 SECOND) and now()

其中,date_add 方法用来执行日期加法运算,点击查看详情

上面语句利用 data_add 在当前时间的基础上减去5分钟(300秒),然后进行 between 运算。

(2)查询当天的所有数据

SELECT * FROM t_uuid_data WHERE DATEDIFF(create_date, now()) = 0

其中,datediff 方法用来计算两个日期之间间隔天数,点击查看详情

(3)查询昨天的所有数据

SELECT * FROM t_uuid_data WHERE datediff(create_date, now())=-1

(4)查询未来第N天的所有数据,例如:查询未来第5天的数据

SELECT * FROM t_uuid_data WHERE DATEDIFF(create_date, NOW())=5

(5)查询未来N天内所有数据,例如:查询未来5天内的所有数据

-- 包含今天
SELECT * FROM t_uuid_data WHERE DATEDIFF(create_date,NOW()) < 5 AND DATEDIFF(create_date,NOW())>=0
-- 不包含今天
SELECT * FROM t_uuid_data WHERE DATEDIFF(create_date,NOW()) <= 5 AND DATEDIFF(create_date,NOW())>0

(6)查询过去N天内所有数据

-- 查询过去5天内的数据,包含当天
SELECT * FROM t_uuid_data WHERE DATEDIFF(create_date,NOW())<=0 AND DATEDIFF(create_date,NOW())>-5
-- 查询过去5天内的数据,不包含当天
SELECT * FROM t_uuid_data WHERE DATEDIFF(create_date,NOW())<0 AND DATEDIFF(create_date,NOW())>=-5

(7)只获取今天的数据

select * from t_uuid_data where to_days(create_date) = to_days(now());

其中,to_days 返回指定日期自 0 年以来的天数点击查看详情

(8)只获取昨天的数据

SELECT * FROM t_uuid_data WHERE TO_DAYS(NOW()) - TO_DAYS(create_date) = 1

(9)获取近7天的数据

SELECT * FROM t_uuid_data where create_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)

其中,DATE_SUB 函数用来执行日期减法运算,点击查看详情

(10)获取近30天的数据

SELECT * FROM t_uuid_data where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(create_date)

(11)获取本月的数据

SELECT * FROM t_uuid_data WHERE DATE_FORMAT(create_date, '%Y%m') = DATE_FORMAT(CURDATE(), '%Y%m')

其中,DATE_FORMAT 函数用来格式化指定的日期,点击查看详情

(11)获取上一月的数据

SELECT * FROM t_uuid_data 
WHERE PERIOD_DIFF(date_format(now(), '%Y%m'), date_format(create_date,'%Y%m'))=1

其中,PERIOD_DIFF 返回两个日期之间的月数点击查看详情

(12)获取本季度数据

select * from t_uuid_data where QUARTER(create_date)=QUARTER(now());

其中,QUARTER 返回指定日期的一年中的季度,范围为 1 到 4点击查看详情

(13)获取上季度数据

select * from t_uuid_data 
where QUARTER(create_date)=QUARTER(DATE_SUB(now(), interval 1 QUARTER));

(14)获取本年数据

select * from t_uuid_data where YEAR(create_date)=YEAR(NOW());

(15)获取上年数据

select * from t_uuid_data where year(create_date)=year(date_sub(now(),interval 1 year));

(16)获取当前这周的数据

SELECT * FROM t_uuid_data WHERE YEARWEEK(date_format(create_date,'%Y-%m-%d')) = YEARWEEK(now());

(17)获取上周的数据

SELECT * FROM t_uuid_data WHERE YEARWEEK(date_format(create_date,'%Y-%m-%d')) = YEARWEEK(now())-1;

(18)获取上个月的数据

select * FROM t_uuid_data 
where date_format(create_date,'%Y-%m')=date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m')

(19)获取当前月份的数据

select * from t_uuid_data where date_format(create_date,'%Y-%m')=date_format(now(),'%Y-%m')

(20)获取距离当前现在6个月的数据

select * from t_uuid_data where create_date between date_sub(now(), interval 6 month) and now();


不是每一次努力都有收获,但是,每一次收获都必须努力。
0 不喜欢
热门推荐
官方正版 高性能MySQL 第3版 SQL优化数据库管理 mysql从入门到精通必知必会...

“只缺这一本,有这一本足矣!”
“只要你不敢以MySQL专家自诩,又岂敢错误这本神书?”

MySQL技术内幕:InnoDB存储引擎(第2版)

基于MySQL 5.6,结合源代码,从存储引擎内核角度对InnoDB的整体架构、核心实现和工作机制进行深入剖析


说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号