统计今天 昨天 7天前 一个月前 上个季度等的数据

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/xjh163/article/details/96305854
select now()   -- 当前的日期时间 
select TO_DAYS(now())  -- 返回从0年开始到当前时间的总天数
select date(now())  -- 返回当前日期   
等价于  select curdate();


今天
select * from 表名 where to_days(时间字段名) = to_days(now()); 
select * from  表名 where date(时间字段名)=date(now()); 
select * from 表名 where 时间字段名 >今天的日期 and 时间字段名<明天的日期

昨天
SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1
select * from  表名 where date(时间字段名)='昨天日期'; 
select * from 表名 where 时间字段名 >昨的日期 and 时间字段名<今天的日期

近7天
SELECT * FROM 表名 where  date(时间字段名) >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)  
-- date_add和date_sub返回的是一个日期,这里返回的是7天前的那个日期,然后我们用date(时间字段名)相比就可以得到一个区间


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

本月
SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, '%Y%m' ) = DATE_FORMAT( CURDATE( ) , '%Y%m' )
SELECT * FROM  `表名`  where date_format(时间字段名,'%Y-%m')=date_format(now(),'%Y-%m')
SELECT *FROM 表 WHERE PERIOD_DIFF(DATE_FORMAT(CURDATE(),'%Y%m),DATE_FORMAT(时间字段名,'%Y%m'))=0

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

查询本季度数据
select * from `表名` where QUARTER(时间字段名)=QUARTER(now());

查询上季度数据
select * from `表名` where QUARTER(时间字段名)=QUARTER(DATE_SUB(now(),interval 1 QUARTER));

查询本年数据
select * from `表名` where YEAR(时间字段名)=YEAR(NOW());

查询上年数据
select * from `表名` where year(时间字段名)=year(date_sub(now(),interval 1 year));

查询当前这周的数据 
SELECT * FROM `表名`WHERE YEARWEEK(date_format(时间字段名,'%Y-%m-%d')) = YEARWEEK(now());

查询这周周一的数据
select  date_sub('2019-08-22',INTERVAL weekday('2019-08-22') day)

查询上周的数据
SELECT * FROM  `表名` WHERE YEARWEEK(date_format(时间字段名,'%Y-%m-%d')) = YEARWEEK(now())-1;

查询距离当前现在6个月的数据
SELECT * FROM  `表名`  where 时间字段名 between date_sub(now(),interval 6 month) and now();


获取下个月数据

SELECT *FROM 表 WHERE PERIOD_DIFF(DATE_FORMAT(CURDATE(),'%Y%m),DATE_FORMAT(字段名,'%Y%m'))=-1 -- 以年月为维度

例如当前时间为2018-07-02 则取数据范围为2018-08-01至2018-08-31

SELECT *FROM 表 WHERE PERIOD_DIFF(DATE_FORMAT(CURDATE(),'%m),DATE_FORMAT(字段名,'%m'))=-1  -- 以月为维度

例如当前时间为2018-07-02 则取数据范围为所有数据中满足字段名中月份为08-01至08-31的数据(可用于筛选下个月生日人员)

补充1

日期转数字

select date('2019-01-01' )-0
--->20190101

select CONVERT(date('2019-01-01'),unsigned)
--->20190101

date_add,date_sub 可以将数字转换为日期

date(created) between date_add(curdate()-day(curdate())+24,interval -1 month) and date_add(curdate()-day(curdate())+23,interval 0 month)    上月 24 到本月23
一周内
yearweek(date(created)=yearweek(now())-1
yearweek(date_format(created,'%Y-%m-%d'))=yearweek(now())-1  

yearweek 支持时间类型
select yearweek('2019-07-24 23:34:34') 
--->201929
截止到目前大于18岁
TIMESTAMPDIFF(YEAR,`birthdate`, date(created) > 18  
TIMESTAMPDIFF(YEAR,`birthdate`, date(created) > 18  
SELECT  t.`user_id`,
      @age:= TIMESTAMPDIFF(YEAR,t.`birthdate`,date_format(t.created,'%Y-%m-%d')),
      CASE
          WHEN @age >0
               AND @age <=18 THEN '0~18'
          WHEN @age >18
               AND @age <=25 THEN '18~25'
          WHEN @age >25
               AND @age <=30 THEN '25~30'
          WHEN @age >30
               AND @age <=35 THEN '30~35'
          WHEN @age >35
               AND @age <=40 THEN '35~40'
          WHEN @age >40
               AND @age <=45 THEN '40~45'
          WHEN @age >45
               AND @age <=50 THEN '45~50'
          WHEN @age >50
               AND @age <=55 THEN '50~55'
          WHEN @age >55
               AND @age <=60 THEN '55~60'
          ELSE '60以上'
      END AS age_range
  FROM tb_name t ,
      (SELECT @age:= 0) p
  WHERE t.`birthdate` <> ''

参考链接:
https://blog.csdn.net/xu137324/article/details/80883117
https://uule.iteye.com/blog/2159811

猜你喜欢

转载自blog.csdn.net/xjh163/article/details/96305854