前言

在我们日常开发中,在很多情况下都会使用到很多与时间相关的sql,包括但不限于本日本周本月本年近周近月近年等常见的sql,对于这些常见的计算逻辑,本文进行了及其详细的整理与归纳,有需要的小伙伴可以自行获取与学习~

ㅤㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ

1.获取本日本周本月本年

  • 昨日
SELECT  *  FROM 表名 WHERE
DAYOFYEAR( date_format( 时间字段, '%Y-%m-%d' ) ) = DAYOFYEAR( ( SELECT max( 时间字段 ) FROM 表名 ) ) - 1
  • 本周(从周日开始计算)
SELECT * FROM 表名 WHERE 
YEARWEEK( date_format( 时间字段名, '%Y-%m-%d' ) ) = YEARWEEK( (SELECT max( 时间字段名 ) FROM 表名) ) 
###########
SELECT * FROM 表名 WHERE 
YEARWEEK(date_format( 时间字段名 ,'%Y-%m-%d')) = YEARWEEK(now())
  • 本周(从周一开始计算)
SELECT * FROM 表名 WHERE YEARWEEK(date_format(时间字段,'%Y-%m-%d'),1) = YEARWEEK(now(),7);
 
SELECT * FROM 表名 WHERE YEARWEEK(date_format(时间字段,'%Y-%m-%d'),1) = YEARWEEK((SELECT max( 时间字段名 ) FROM 表名),7);
  • 上周
SELECT * FROM 表名 WHERE 
YEARWEEK(date_format( 时间字段名, '%Y-%m-%d' ) ) = YEARWEEK( (SELECT max( 时间字段名 ) FROM 表名) )-1
  • 本月
SELECT * FROM 表名  WHERE DATE_FORMAT( 时间字段名 , '%Y-%m' ) =DATE_FORMAT( CURDATE( ) , '%Y-%m' )
#########
SELECT * FROM 表名  WHERE DATE_FORMAT( wfsj, '%Y-%m' ) = DATE_FORMAT( ( SELECT max( 时间字段名 ) FROM 表名 ), '%Y-%m' )
  • 上月
SELECT * FROM  表名  WHERE PERIOD_DIFF( date_format( now( ) , '%Y-%m' ) , date_format( 时间字段名, '%Y-%m' ) ) =1  
  • 本年
SELECT * FROM 表名  WHERE DATE_FORMAT( 时间字段名, '%Y' ) = DATE_FORMAT( ( SELECT max( 时间字段名 ) FROM 表名 ), '%Y' )
  • 本季度
select * from 表名  where QUARTER(create_date)=QUARTER(DATE_SUB(now(),interval 1 QUARTER));
  • 查询距离现在xx个月的数据
select * from 表名 where 时间字段名 between date_sub(now(),interval xx month) and now(); 

2.获取近周近月近年

  • 近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_SUB(CURDATE(), INTERVAL 1 MONTH) <=date(时间字段名)
  • 近12个月
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 12 MONTH) <=date(时间字段名)
  • 近年
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 1 YEAR) <=date(时间字段名)

3.获取时间段

熟练使用UNION字段,对两个sql语句进行并集

  • 0-4、4-8、8-12、12-16、16-20、20-24六个时间维度去查询
SELECT
 '0-4时' AS '时间',
 COUNT(*) AS '数量'
FROM 表名 
WHERE
 DATE_FORMAT( 时间字段, '%H' ) >= 0  AND DATE_FORMAT( 时间字段, '%H' ) < 4
 
UNION

SELECT
 '4-8时' AS '时间',
 COUNT(*) AS '数量'
FROM 表名 
WHERE
 DATE_FORMAT( 时间字段, '%H' ) >= 4  AND DATE_FORMAT( 时间字段, '%H' ) < 8
 
UNION

SELECT
 '8-12时' AS '时间',
 COUNT(*) AS '数量'
FROM 表名 
WHERE
 DATE_FORMAT( 时间字段, '%H' ) >= 8  AND DATE_FORMAT( 时间字段, '%H' ) < 12
UNION
SELECT
 '12-16时' AS '时间',
 COUNT(*) AS '数量'
FROM 表名 
WHERE
 DATE_FORMAT( 时间字段, '%H' ) >= 12  AND DATE_FORMAT( 时间字段, '%H' ) < 16
 
UNION

SELECT
 '16-20时' AS '时间',
 COUNT(*) AS '数量'
FROM 表名
WHERE
 DATE_FORMAT( 时间字段, '%H' ) >= 16  AND DATE_FORMAT( 时间字段, '%H' ) < 20
 
UNION

SELECT
 '20-24时' AS '时间',
 COUNT(*) AS '数量'
FROM 表名
WHERE
 DATE_FORMAT( 时间字段, '%H' ) >= 20  AND DATE_FORMAT( 时间字段, '%H' ) < 24
Logo

更多推荐