mybatis+mysql time range query, MySql, mybatis query data of the day, this week, this month, this quarter, this year

I. Introduction

Many times we need to query data within a specified time period, such as a certain month, a certain year of data, there are two methods in Mysql,

1.DATE_FORMAT (date, format)能根据格式串format 格式化日期或日期和时间值date,返回结果字符串。
2.STR_TO_DATE(str,format) 将制定日期格式字符串时间表达式转化为 DTAE类型

common format

format example result
%Y-%m-%d 2021-08-17
%Y-%m-%d %H:%i:%s 2021-08-17 04:55:46
%b %d %Y %h:%i %p Aug 17 2021 08:21 PM

In mysql, the string date can be directly compared with the datetime type without conversion. Mysql will convert the string type date into a long integer number for comparison. Of course, you can also convert it to the same type and then compare.

mysql date and string conversion function:

字符串转日期:STR_TO_DATE('2021-08-17 00:00:33', '%Y-%m-%d %H:%i:%s')   走索引
日期转字符串:DATE_FORMAT('2021-08-17 00:00:33', '%Y-%m-%d %H:%i:%s') 不走索引

Generally, there are several ways to check:

Method 1, between...and (recommended)

SELECT * FROM k_student WHERE create_time  between '2021-08-17 00:00:33' and '2021-08-17 00:54:33'

Method 2, greater than or less than sign

SELECT * FROM k_student WHERE create_time >= '2021-08-17 00:00:33' AND create_time <= '2019-07-25 00:54:32'

Method 3: Convert to UNIX_TIMESTAMP for comparison. If create_time is indexed, the index will not be used

SELECT * FROM k_student WHERE  UNIX_TIMESTAMP(create_time)  between UNIX_TIMESTAMP('2021-08-17 00:00:33') and UNIX_TIMESTAMP('2021-08-17 00:54:33')

Corresponding to mybatis is as follows:

select * from table_name where user_id=#{
    
    userId} AND DATE_FORMAT(order_time,'%Y-%m-%d')  between #{
    
    start} AND #{
    
    end}

Two, common time query SQL statement

today

SELECT * FROM 表名 WHERE TO_DAYS(时间字段名) = TO_DAYS(NOW());

yesterday

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

this week

SELECT * FROM 表名 WHERE YEARWEEK(DATE_FORMAT(时间字段名,'%Y-%m-%d')) = YEARWEEK(NOW());

last week

SELECT * FROM 表名 WHERE YEARWEEK(DATE_FORMAT(时间字段名,'%Y-%m-%d')) = YEARWEEK(NOW())-1;

last 7 days

SELECT * FROM 表名 WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(时间字段名);

this month

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

6 months

SELECT * FROM 表名 WHERE 时间字段名 BETWEEN DATE_SUB(NOW(),INTERVAL 6 MONTH) AND NOW();

last month

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

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

SELECT * FROM 表名 WHERE WEEKOFYEAR(FROM_UNIXTIME(时间字段名,'%y-%m-%d')) = WEEKOFYEAR(NOW()); 

SELECT * FROM 表名 WHERE MONTH(FROM_UNIXTIME(时间字段名,'%y-%m-%d')) = MONTH(NOW()); 

SELECT * FROM 表名 WHERE YEAR(FROM_UNIXTIME(时间字段名,'%y-%m-%d')) = YEAR(NOW()) AND MONTH(FROM_UNIXTIME(时间字段名,'%y-%m-%d')) = MONTH(NOW());

this quarter

SELECT * FROM 表名 WHERE QUARTER(时间字段名) = QUARTER(NOW());

last quarter

SELECT * FROM 表名 WHERE QUARTER(时间字段名) = QUARTER(DATE_SUB(NOW(),INTERVAL 1 QUARTER));

last quarter

SELECT * FROM 表名 WHERE YEAR(时间字段名)=YEAR(NOW());

this year

SELECT * FROM 表名 WHERE YEAR(时间字段名)=YEAR(NOW());

last year

SELECT * FROM 表名 WHERE YEAR(时间字段名) = YEAR(DATE_SUB(NOW(),INTERVAL 1 YEAR));

Guess you like

Origin blog.csdn.net/mashangzhifu/article/details/119764918