当前位置: 首页 > news >正文

【MySQL】获取最近7天和最近14天的订单数量,使用MySQL详细写出,使用不同的方法

1. 获取最近7天和最近14天的订单数量,使用MySQL详细写出,使用不同的方法

要获取最近7天和最近14天的订单数量,我们可以使用不同的方法来优化查询性能。以下是两种方法:

1.1 方法一:使用日期计算

SELECTSUM(CASE WHEN create_time BETWEEN CURDATE() - INTERVAL 6 DAY AND CURDATE() THEN 1 ELSE 0 END) AS orders_last_7_days,SUM(CASE WHEN create_time BETWEEN CURDATE() - INTERVAL 13 DAY AND CURDATE() THEN 1 ELSE 0 END) AS orders_last_14_days
FROMsale_order;

在这个查询中,我们使用 CASE 表达式来判断订单的创建时间是否在最近7天或14天内。如果是,那么对应的 SUM 表达式会增加1,否则增加0。最后,我们得到每个时间段内的订单总数。

1.2 方法二:使用条件聚合

SELECTCOUNT(CASE WHEN create_time BETWEEN CURDATE() - INTERVAL 6 DAY AND CURDATE() THEN order_id ELSE NULL END) AS orders_last_7_days,COUNT(CASE WHEN create_time BETWEEN CURDATE() - INTERVAL 13 DAY AND CURDATE() THEN order_id ELSE NULL END) AS orders_last_14_days
FROMsale_order;

这个方法与方法一类似,但是它使用 COUNT 函数和 CASE 表达式来直接计算订单数量。如果 create_time 在指定的日期范围内,CASE 表达式返回 order_id,否则返回 NULLCOUNT 函数会忽略 NULL 值,只计算非 NULL 的值。

1.3 方法三:使用日期函数和聚合

SELECT-- 最近7天的订单数量IFNULL(SUM(CASE WHEN DATEDIFF(CURDATE(), create_time) <= 7 THEN 1 ELSE 0 END), 0) AS orders_last_7_days,-- 最近14天的订单数量IFNULL(SUM(CASE WHEN DATEDIFF(CURDATE(), create_time) <= 14 THEN 1 ELSE 0 END), 0) AS orders_last_14_days
FROMsale_order;

在这个查询中,我们使用 DATEDIFF 函数来计算当前日期和订单创建日期之间的天数差。如果天数差小于或等于7或14,那么 CASE 表达式返回1,否则返回0。然后,我们使用 SUM 函数来计算总和。

1.4 方法四:使用日历表(对于大数据量更有效)

如果数据量非常大,可以考虑使用日历表来优化查询。日历表是一个包含日期的表,可以与订单表进行关联查询。

首先,创建一个日历表:

CREATE TABLE calendar (date DATE PRIMARY KEY
);INSERT INTO calendar (date) VALUES ('2023-01-01'), ('2023-01-02'), ..., ('2023-12-31');

然后,使用日历表来查询:

SELECTc.date,COUNT(*) AS orders_count
FROMsale_order so
JOINcalendar c ON so.create_time BETWEEN c.date AND c.date + INTERVAL 6 DAY
GROUP BYc.date
HAVINGc.date >= CURDATE() - INTERVAL 7 DAY;

这个查询将返回最近7天的订单数量。通过关联日历表,我们可以快速计算出每个日期范围内的订单数量。

1.5 注意事项

  • 确保 create_time 字段上有索引,以加速日期范围查询。
  • 如果 create_time 包含时间信息,确保比较的是日期部分。
  • 根据实际数据量和查询频率,选择合适的方法。对于非常大的数据集,使用日历表可能更有效。
  • 考虑查询缓存和查询优化器的提示,以进一步提高性能。

2. 如何为MySQL中的日期字段创建合适的索引以提高查询效率?要为MySQL中的日期字段创建合适的索引以提高查询效率,可以采取以下步骤和策略:

  1. 避免在日期字段上使用函数:当查询条件中包含对日期字段的函数调用时(如 DATE_FORMAT, DAY(), MONTH() 等),索引将无法被有效利用。相反,应该将日期字符串转换为日期格式,然后与字段进行比较,以便索引能够被使用。

  2. 使用 BETWEEN 运算符:对于日期范围查询,使用 BETWEEN 运算符而不是 LIKE,因为 LIKE 可能会导致全表扫描。例如,使用 create_time BETWEEN '2021-01-01' AND '2021-01-31' 而不是 create_time LIKE '2021-01-%'

  3. 创建日期前缀索引:如果字段是 DATETIMETIMESTAMP 类型,并且你经常根据日期部分进行查询,可以考虑创建一个只包含日期部分的索引。例如,使用 ALTER TABLE your_table ADD INDEX idx_date (your_date_column); 来创建索引。

  4. 考虑索引的选择性:索引的选择性是指索引中不同值的数量与表中行的数量的比率。选择性高的索引更有助于提高查询效率。通常,具有高选择性的列(如性别、状态等)是创建索引的好选择。

  5. 使用复合索引:如果查询经常涉及多个列,并且这些列经常一起用于JOIN或WHERE条件,那么可以考虑创建一个复合索引。例如,如果经常根据 user_idcreate_time 进行查询,可以创建一个索引 INDEX idx_user_time (user_id, create_time)

  6. 维护索引:随着数据的不断变化,索引可能会变得碎片化,导致性能下降。定期重建索引可以提高其性能。

  7. 分析查询计划:使用 EXPLAIN 关键字分析查询计划,查看是否使用了索引以及如何优化查询。

  8. 避免过度索引:虽然索引可以提高查询速度,但过多的索引会增加写操作的负担,因为每次插入或更新数据时,索引也需要更新。因此,只对那些经常用于搜索条件的列创建索引。

通过上述方法,可以为MySQL中的日期字段创建合适的索引,以提高查询效率并优化数据库性能。

3.在MySQL中,除了使用日期函数,还有哪些方法可以进行日期范围查询?

在MySQL中,除了使用日期函数进行日期范围查询,还可以采用以下几种方法:

  1. 使用数值计算
    如果日期是以整数形式存储的(例如,‘2021-01-01’ 存储为 20200101),可以通过数值比较来查询日期范围,避免日期函数导致的索引失效。

    SELECT *
    FROM sale_order
    WHERECAST(create_time AS UNSIGNED) >= CAST('2021-01-01' AS UNSIGNED) ANDCAST(create_time AS UNSIGNED) < CAST(CURDATE() AS UNSIGNED);
    
  2. 使用 STR_TO_DATECONCAT
    将日期转换为字符串,并使用 BETWEEN 运算符进行比较。

    SELECT *
    FROM sale_order
    WHERE create_time BETWEEN STR_TO_DATE(CONCAT('2021-01-01', ' 00:00:00'), '%Y-%m-%d %H:%i:%s')AND STR_TO_DATE(CONCAT(CURDATE(), ' 23:59:59'), '%Y-%m-%d %H:%i:%s');
    
  3. 使用 TIMESTAMPDIFF
    使用 TIMESTAMPDIFF 函数来比较日期差异。

    SELECT *
    FROM sale_order
    WHERE TIMESTAMPDIFF(DAY, '2021-01-01', create_time) BETWEEN 0 AND 7;
    
  4. 使用 DATE_SUBDATE_ADD
    使用 DATE_SUBDATE_ADD 函数来计算日期范围的开始和结束点。

    SELECT *
    FROM sale_order
    WHERE create_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)AND create_time < CURDATE();
    
  5. 使用 LEADLAG 窗口函数(MySQL 8.0+):
    如果需要比较当前日期与表中的日期之间的关系,可以使用窗口函数。

    SELECT *
    FROM (SELECT *,LEAD(create_time) OVER (PARTITION BY create_time ORDER BY create_time) AS next_day,LAG(create_time) OVER (PARTITION BY create_time ORDER BY create_time) AS prev_dayFROM sale_order
    ) AS dates
    WHERE create_time BETWEEN '2021-01-01' AND CURDATE()OR next_day BETWEEN '2021-01-01' AND CURDATE()OR prev_day BETWEEN '2021-01-01' AND CURDATE();
    
  6. 使用事件调度器
    对于频繁的日期范围查询,可以设置一个事件调度器,定期计算并存储结果。

  7. 使用应用程序逻辑
    在某些情况下,可以在应用程序层面处理日期范围查询,而不是在数据库层面。

  8. 使用缓存
    如果数据不经常变化,可以将结果缓存起来,避免频繁的数据库查询。

  9. 使用物化视图(在某些存储引擎中可用):
    创建一个物化视图,存储日期范围查询的结果,定期刷新。

选择哪种方法取决于具体的数据模型、查询需求和性能考虑。在某些情况下,组合使用这些方法可能会更有效。

相关文章:

【MySQL】获取最近7天和最近14天的订单数量,使用MySQL详细写出,使用不同的方法

1. 获取最近7天和最近14天的订单数量&#xff0c;使用MySQL详细写出&#xff0c;使用不同的方法 要获取最近7天和最近14天的订单数量&#xff0c;我们可以使用不同的方法来优化查询性能。以下是两种方法&#xff1a; 1.1 方法一&#xff1a;使用日期计算 SELECTSUM(CASE WHE…...

WebView2新增、修改、删除、禁用右键菜单相关操作。

参考链接&#xff1a;WebView2操作右键菜单...

使用vue创建项目

一、安装环境 二、创建vue框架&#xff08;创建文件夹&#xff0c;摁shift鼠标右键 打开&#xff09; 1、项目配置 2、新增目录 三、路径别名配置 输入/ ,VSCode会联想出src下的所有子目录和文件&#xff0c;统一文件路径访问时不容易出错 四、ElementPlus配置 1、组件分为…...

Apache CVE-2021-41773 漏洞攻略

漏洞简介 该漏洞是由于Apache HTTP Server 2.4.49版本存在⽬录穿越漏洞,在路径穿越⽬录 <Directory/>Require all granted</Directory>允许被访问的的情况下&#xff08;默认开启&#xff09;&#xff0c;攻击者可利⽤该路径穿越漏洞读取到Web⽬录之外的其他⽂件在…...

【redis-02】深入理解redis中RBD和AOF的持久化

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756 如需转载&#xff0c;请输入&#xff1a;htt…...

亚马逊IP关联揭秘:发生ip关联如何处理

在亚马逊这一全球领先的电商平台上&#xff0c;IP关联是一个不可忽视的问题&#xff0c;尤其是对于多账号运营的卖家而言。本文将深入解析亚马逊IP关联的含义、影响以及应对策略&#xff0c;帮助卖家更好地理解和应对这一问题。 什么是亚马逊IP关联&#xff1f; 亚马逊IP关联…...

jQuery Mobile 弹窗

jQuery Mobile 弹窗 引言 在移动设备上,弹窗是一种常见的用户界面元素,用于显示信息、获取用户输入或提供特定功能。jQuery Mobile 是一个流行的移动框架,它提供了丰富的组件来帮助开发者创建响应式的移动界面。本文将重点介绍如何在 jQuery Mobile 中使用弹窗(Popup)组…...

【macOS】【zsh报错】zsh: command not found: python

【macOS】【zsh Error】zsh: command not found: python 本地已经安装了Python&#xff0c;且能在Pycharm中编译Python程序并运行。 但是&#xff0c;在macOS终端&#xff0c;运行Python&#xff0c;报错。 首先要确认你在macOS系统下&#xff0c;是否安装了Python。 如果安…...

NoSql数据库Redis知识点

数据库的分类 关系型数据库 &#xff0c;是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库 中的数据主流的 MySQL 、 Oracle 、 MS SQL Server 和 DB2 都属于这类传统数据库。 NoSQL 数据库 &#xff0c;全称为 Not Only SQL &a…...

Redis 使用指南

Redis 使用指南 概述 Redis 是一个开源的、基于内存的数据结构存储系统&#xff0c;可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xff09;、列表&#xff08;lists&#xf…...

c++与cmake:完整的C++项目构建注意事项

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 最近常常使用cmake构建c项目有感,从创建项目到打包发布总结一下需要注意的事情. 项目组织方式 具体的项目组织方式因人而异,这里推荐一种,在src目录中创建模块目录,再在include目录中常见对应的同名目录包含头文件,…...

Linux自主学习篇

用户及权限管理 sudo 是 "superuser do" 的缩写&#xff0c;是一个在类 Unix 操作系统&#xff08;如 Linux 和 macOS&#xff09;中使用的命令。它允许普通用户以超级用户&#xff08;root 用户&#xff09;的身份执行命令&#xff0c;从而获得更高的权限。 useradd…...

MQ入门(4)

Erlang&#xff1a;面向高并发的 单机的吞吐量就是并发性&#xff1a;Rabbitmq是10w左右&#xff08;现实项目中已经足够用了&#xff09;&#xff0c;RocketMQ是10w到20w&#xff0c;Kafka是100w左右。 公司里的并发&#xff08;QPS&#xff09; 大部分的公司每天的QPS大概…...

linux下共享内存的3种使用方式

进程是资源封装的单位&#xff0c;内存就是进程所封装的资源的一种。一般情况下&#xff0c;进程间的内存是相互隔离的&#xff0c;也就是说一个进程不能访问另一个进程的内存。如果一个进程想要访问另一个进程的内存&#xff0c;那么必须要进过内核这个桥梁&#xff0c;这就是…...

伊丽莎白·赫莉为杂志拍摄一组素颜写真,庆祝自己荣膺全球最性感女人第一名

语录&#xff1a;女性应该做任何她们想做的事&#xff0c;批评她们的人都见鬼去吧。 伊丽莎白赫莉为《Maxim》杂志拍摄一组素颜写真&#xff0c;庆祝自己荣膺全球最性感女人第一名 伊丽莎白赫莉 (Elizabeth Hurley) 实在是太惊艳了&#xff0c;如今&#xff0c;《马克西姆》杂…...

Qt快捷键说明与用法

编辑与查找 CtrlF&#xff1a;在当前编辑窗口中查找关键字。支持大小写相关、全词匹配、正则表达式匹配等选项&#xff0c;并且查找之后还可以进行替换操作。 CtrlShiftF&#xff1a;进行全局查找&#xff0c;不局限于当前文件。注意&#xff0c;在某些情况下&#xff0c;这个…...

技术周刊 | TS 5.6、Chrome DevTools 性能面板上新、Vite 6 Beta、Fastify v5、HTTP 新方法 Query

增长能力&#xff0c;就是持续做出正确决定的能力。 大家好&#xff0c;我是童欧巴&#xff0c;欢迎来到第 128 期技术周刊。 资讯 TypeScript 5.6 TypeScript 5.6 如期发布。 Chrome DevTools 发布全新性能功能 Chrome DevTools 的性能面板上新测试&#xff0c;包括 Core…...

使用Mockito进行单元测试

1、单元测试介绍 Mockito和Junit是用于单元测试的常用框架。单元测试即&#xff1a;从最小的可测试单元&#xff08;如函数、方法或类&#xff09;开始&#xff0c;确保每个单元都能按预期工作。单元测试是白盒测试的核心部分&#xff0c;它有助于发现单元内部的错误。 单元测试…...

CSS 布局三大样式简单学习

目录 1. css 浮动 1.1 效果1 1.2 效果2 1.3 效果3 1.4 效果4 2. css 定位 2.1 absolute 2.2 relative 2.3 fixed 3. css 盒子模型 3.1 效果1 3.2 效果2 3.3 效果3 3.4 效果4 1. css 浮动 1.1 效果1 1.2 效果2 1.3 效果3 1.4 效果4 2. css 定位 2.1 absolute 2.2 …...

集成运放UA741的原理与应用的探索

我们发现TI公司提供了UA741的内部电路&#xff0c;此电路包括22个晶体管&#xff0c;11个电阻&#xff0c;1个二极管&#xff0c;1个电容。 1UA741设计需求 1.1有短路保护 UA741的短路保护功能‌是指当输出端发生短路时&#xff0c;该器件能够自动保护自身&#xff0c;防止因…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...