当前位置: 首页 > 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;防止因…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...