mysql 查询当天、本周,本月,上一个月的数据

本文提供了一系列MySQL查询语句,用于按不同时间段(如当天、本周、本月等)筛选数据,并展示了如何统计特定时间范围内的记录数量。此外还介绍了多表关联、函数查询及嵌套查询等高级技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql 查询当天、本周,本月,上一个月的数据

今天

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

昨天

SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1

近7天

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名)

近30天

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名)

本月

SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )

上一月

SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1

查询本季度数据

select * from `ht_invoice_information` where QUARTER(create_date)=QUARTER(now());

查询上季度数据

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

查询本年数据

select * from `ht_invoice_information` where YEAR(create_date)=YEAR(NOW());

查询上年数据

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

查询当前这周的数据

SELECT name,时间字段名FROM enterprise WHERE YEARWEEK(date_format(时间字段名,'%Y-%m-%d')) = YEARWEEK(now());

查询上周的数据

SELECT name,时间字段名FROM enterprise WHERE YEARWEEK(date_format(时间字段名,'%Y-%m-%d')) = YEARWEEK(now())-1;

查询上个月的数据

select name,submittime from enterprise where date_format(submittime,'%Y-%m')=date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m')

select * from user where DATE_FORMAT(pudate,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m') ; 

select * from user where WEEKOFYEAR(FROM_UNIXTIME(pudate,'%y-%m-%d')) = WEEKOFYEAR(now()) 

select * from user where MONTH(FROM_UNIXTIME(pudate,'%y-%m-%d')) = MONTH(now()) 

select * from user where YEAR(FROM_UNIXTIME(pudate,'%y-%m-%d')) = YEAR(now()) and MONTH(FROM_UNIXTIME(pudate,'%y-%m-%d')) = MONTH(now()) 

select * from user where pudate between  上月最后一天  and 下月第一天 

查询当前月份的数据

select name,submittime from enterprise   where date_format(submittime,'%Y-%m')=date_format(now(),'%Y-%m')

查询距离当前现在6个月的数据

select name,submittime from enterprise where submittime between date_sub(now(),interval 6 month) and now();

查询每天每周每月每年的总数

查询每天的数据:

SELECT
    COUNT(1) AS countNumber,
    DATE_FORMAT(createTime,'%Y-%m-%d') AS dateTime
FROM
    testTable
GROUP BY DATE_FORMAT(createTime,'%Y-%m-%d')

查询每周的数据:

SELECT
    COUNT(1) AS countNumber,
    WEEK(createTime) as dateTime
FROM
    testTable
GROUP BY WEEK(createTime) 

查询每月的数据:

SELECT
    COUNT(1) AS countNumber,
    MONTH(createTime) as dateTime
FROM
    testTable
GROUP BY MONTH(createTime)

查询每年的数据:

SELECT
    COUNT(1) AS countNumber,
    YEAR(createTime) as dateTime
FROM
    testTable
GROUP BY YEAR(createTime)

其它:

DATE_ADD(createTime,INTERVAL 1 DAY) 得到指定日期后一天的日期/把1改为任意数字就可以得到后N天的日期

DATE_SUB(createTime,INTERVAL 1 DAY) 得到指定日期前一天的日期/把1改为任意数字就可以得到前N天的日期

声明变量查询:

SET @counter=0;
select @counter:=@counter+1 as id,count(*) as num FROM testTable ORDER BY num desc

去重选择后返回条数

SELECT COUNT(DISTINCT(id)) from 数据表 WHERE createdDate BETWEEN '2009-08-06 15:53:14' AND '2009-09-01 15:53:14'

查出第几周到第几周的区间数据:

SELECT 
COUNT(DISTINCT(id)) ,
WEEK(date_format('2009-08-05 15:53:14','%Y-%m-%d'),1) AS startweek,
WEEK(date_format('2009-08-06 15:53:14','%Y-%m-%d'),1) AS endweek
from 数据表
WHERE
 WEEK(date_format(createdDate,'%Y-%m-%d'),1)
BETWEEN
 WEEK(date_format('2009-08-05 15:53:14','%Y-%m-%d'),1)
 AND WEEK(date_format('2009-08-06 15:53:14','%Y-%m-%d'),1);

多表关联查询:

SELECT
COUNT(DISTINCT(account)) as fuNum, 
op.*,
p.*
from 
A o
LEFT JOIN B op
ON o.id = op.id
LEFT JOIN C p
ON op.id = p.id
WHERE
 WEEK(date_format(createdDate,'%Y-%m-%d'),1)
BETWEEN
 WEEK(date_format('2009-08-05 15:53:14','%Y-%m-%d'),1)
 AND WEEK(date_format('2009-08-06 15:53:14','%Y-%m-%d'),1)
AND id = 3

函数查询求和:

SELECT
COUNT(DISTINCT(op.a)) as pa, 
COUNT(p.b) AS sa,
SUM(o.c) AS ta
from 
A o
LEFT JOIN B op
ON o.id = op.id
LEFT JOIN C p
ON op.id = p.id
WHERE
 WEEK(date_format(createdDate,'%Y-%m-%d'),1)
BETWEEN
 WEEK(date_format('2009-08-05 15:53:14','%Y-%m-%d'),1)
 AND WEEK(date_format('2009-08-06 15:53:14','%Y-%m-%d'),1)
AND id = 3

嵌套查询:

SELECT
DISTINCT
(CASE  account
WHEN '0' THEN 'null'
ELSE (SELECT COUNT( DISTINCT(account) ) FROM  eps_order WHERE payStatus = 'paid') END) AS payNum,
COUNT(p.`order`) AS saleOrders,
SUM(o.amount) AS totalAmount
from 
A o
LEFT JOIN B op
ON o.id = op.orderID
LEFT JOIN C p
ON op.productID = p.id
WHERE
 WEEK(date_format(createdDate,'%Y-%m-%d'),1)
BETWEEN
 WEEK(date_format('2009-08-05 15:53:14','%Y-%m-%d'),1)
 AND WEEK(date_format('2009-08-06 15:53:14','%Y-%m-%d'),1)
AND  o.`status` != 'canceled'
AND productID = 3

多重嵌套查询:


SELECT
DISTINCT
(CASE  o.account
WHEN NULL THEN 'null'
ELSE 
(
SELECT 
COUNT( DISTINCT(o.account) ) 
from 
A o
LEFT JOIN B op
ON o.id = op.orderID
LEFT JOIN C p
ON op.productID = p.id
WHERE
 WEEK(date_format(createdDate,'%Y-%m-%d'),1)
BETWEEN
 WEEK(date_format('2009-08-05 15:53:14','%Y-%m-%d'),1)
 AND WEEK(date_format('2009-08-06 15:53:14','%Y-%m-%d'),1)
AND  o.`status` != 'canceled'
AND productID = 3
) 
END) AS payNum,
COUNT(p.`order`) AS saleOrders,
SUM(o.amount) AS totalAmount
from 
A o
LEFT JOIN B op
ON o.id = op.orderID
LEFT JOIN C p
ON op.productID = p.id
WHERE
 WEEK(date_format(createdDate,'%Y-%m-%d'),1)
BETWEEN
 WEEK(date_format('2018-08-05 15:53:14','%Y-%m-%d'),1)
 AND WEEK(date_format('2018-08-06 15:53:14','%Y-%m-%d'),1)
AND  o.`status` != 'canceled'
AND productID = 3


<think>好的,我现在要解决用户的问题:如何在MySQL查询本月数据信息。首先,我需要理解用户的需求。用户可能有一个包含日期或时间戳字段的表,想要筛选出当前月份内的所有记录。例如,销售记录、日志数据等,需要按月份统计。 接下来,我应该考虑如何用SQL实现这一点。MySQL中有日期函数,比如CURDATE()获取当前日期,YEAR()MONTH()提取年份月份。用户可能希望比较表中日期字段的年份月份是否与当前年份月份一致。 首先,基本的思路是使用WHERE子句来过滤数据。比如,假设表中有一个日期字段叫create_time,可以使用YEAR(create_time) = YEAR(CURDATE()) AND MONTH(create_time) = MONTH(CURDATE())。不过,这种方法可能不会使用索引,导致查询效率低下,尤其是在数据量大的情况下。用户可能不知道性能问题,需要提醒他们注意。 另一个方法是使用BETWEEN日期范围。计算本月的第一天最后一天,然后使用BETWEEN。比如,DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE())-1 DAY)获取本月第一天,LAST_DAY(CURDATE())获取最后一天。这样,查询条件可以写成create_time BETWEEN 本月第一天 AND 本月最后一天。这种方法可能更高效,尤其是如果字段上有索引的话。 还需要考虑时间部分的问题。如果日期字段包含时间,比如datetime类型,BETWEEN本月第一天可能会包括当天的00:00:00到最后一天的23:59:59。而使用YEARMONTH的方法则不考虑时间部分,只要是同一个月即可。用户的需求是否包含时间部分?可能需要根据实际情况调整。 然后,用户可能需要具体的示例。比如,完整的SQL语句,包括SELECT部分,以及不同的方法比较。此外,可能需要解释为什么使用BETWEEN可能更高效,因为涉及到索引的使用。 另外,用户可能没有考虑到时区的问题。如果服务器时区用户所在时区不同,CURDATE()的结果可能会有差异。需要提醒用户确认时区设置是否正确,特别是在跨时区的应用中。 还可能有一些特殊情况,比如当表中日期字段允许为空,或者存在未来的日期,这时候查询是否需要处理这些情况。但用户的问题比较基础,可能不需要深入讨论这些,但需要确保示例中的条件正确。 总结,用户需要的是一个准确且高效的查询本月数据的方法。我需要提供两种方法,解释它们的优缺点,并给出示例。同时,提醒索引性能问题,以及时区的注意事项,确保用户能够根据自身情况选择合适的方法。</think>--- 在MySQL查询**本月数据**,核心思路是通过日期函数筛选出**年份月份与当前时间相同**的记录。以下是两种常用方法: --- ### **方法1:使用`YEAR()``MONTH()`函数** ```sql SELECT * FROM 表名 WHERE YEAR(日期字段) = YEAR(CURDATE()) --年份等于当前年份 AND MONTH(日期字段) = MONTH(CURDATE()); --月份等于当前月份 ``` - **优点**:逻辑简单,直接比较年月。 - **缺点**:如果日期字段有索引,可能无法利用索引优化(因为用函数包裹了字段)。 --- ### **方法2:使用日期范围`BETWEEN`** ```sql SELECT * FROM 表名 WHERE 日期字段 BETWEEN DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE())-1 DAY) --本月第一天(如2024-05-01) AND LAST_DAY(CURDATE()); --本月最后一天(如2024-05-31 23:59:59) ``` - **优点**:直接利用日期范围,如果字段有索引,查询效率更高。 - **说明**:`BETWEEN`包含边界值,适合精确匹配时间段。 --- ### **参数解释** | 函数/表达式 | 作用 | |-----------------------------------|--------------------------------------| | `CURDATE()` | 返回当前日期(如`2024-05-20`) | | `DAY(CURDATE())` | 返回今天是几号(如`20`) | | `DATE_SUB(日期, INTERVAL n DAY)` | 从日期中减去n天 | | `LAST_DAY(日期)` | 返回日期所在月份的最后一天 | --- ### **实际案例** 假设表为`sales`,字段`sale_time`记录销售时间: ```sql -- 统计本月销售额 SELECT SUM(amount) AS 本月销售额 FROM sales WHERE sale_time BETWEEN DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE())-1 DAY) AND LAST_DAY(CURDATE()); ``` --- ### **注意事项** 1. **时区问题** - `CURDATE()`依赖数据库服务器时区,确保服务器时区与业务需求一致。 2. **时间精度** - 如果字段是`DATETIME`类型(包含时分秒),`BETWEEN`会覆盖整个月份(从第一天00:00:00到最后一天23:59:59)。 3. **索引优化** - 如果日期字段有索引,优先使用方法2(范围查询),避免对字段使用函数(如`YEAR()`、`MONTH()`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值