MySQL區間函式 MySQL如何獲取指定日期區間

2021-10-17 15:22:43 字數 3569 閱讀 9487

假設現在有這樣乙個需求: 資料庫中有一張產品訂單表,表中有date型別的字段create_date代表訂單建立的日期,要求獲取建立日期為3月25號到4月24號之間的訂單.很明顯,這個區間對應乙個月的跨度,但是並不是自然月,這個需求該怎麼實現呢?為了說明如何解決該需求,先建立表productorder.

productorder

使用以下指令碼建立表並插入一些原始資料:create table if not exists productorder(

id int(11) auto_increment comment '訂單表主鍵',

order_id bigint(64) not null comment '訂單表唯一業務id',

product_id bigint(64) not null comment '產品唯一編號id',

create_date date not null comment '訂單建立時間',

create_timestamp timestamp not null default current_timestamp comment '訂單建立時間戳',

primary key(id)

) engine=innodb auto_increment=1 default charset=utf8;

insert into productorder(order_id,product_id,create_date,create_timestamp) values('1','1','2018-03-24','2018-03-24 23:33:33');

insert into productorder(order_id,product_id,create_date,create_timestamp) values('1','1','2018-03-25','2018-03-25 23:33:33');

insert into productorder(order_id,product_id,create_date,create_timestamp) values('1','1','2018-03-26','2018-03-26 23:33:33');

insert into productorder(order_id,product_id,create_date,create_timestamp) values('1','1','2018-03-27','2018-03-27 23:33:33');

insert into productorder(order_id,product_id,create_date,create_timestamp) values('1','1','2018-04-21','2018-04-21 23:33:33');

insert into productorder(order_id,product_id,create_date,create_timestamp) values('1','1','2018-04-23','2018-04-23 23:33:33');

insert into productorder(order_id,product_id,create_date,create_timestamp) values('1','1','2018-04-24','2018-04-24 23:33:33');

insert into productorder(order_id,product_id,create_date,create_timestamp) values('1','1','2018-04-25','2018-04-25 23:33:33');

insert into productorder(order_id,product_id,create_date,create_timestamp) values('1','1','2018-04-26','2018-04-26 23:33:33');

insert into productorder(order_id,product_id,create_date,create_timestamp) values('1','1','2018-04-27','2018-04-27 23:33:33');

相關函式

date_sub

date_sub用於減去指定的日期,可以按日減,按月減,按年減等.它的語法是這樣的date_sub(date,interval expr type),date代表原始日期,比如2018-04-23.interval是固定值,expr代表減去的數目,type代表減去的時間單位,比如減去乙個月的表示式就是date_sub('2018-04-23',interval 1 month),得到的結果是2018-03-23.更多可以使用的單位和細節參考mysql date_sub() 函式.另外,如果是加上一定的時間,可以使用date_add函式.

left

mysql可以使用left(), right(), substring(), substring_index()等字串擷取函式擷取字串.這裡以left為例,它的表示式是left(str,length).str是待擷取的字串,這裡假設是2018-03-23,length代表從左邊開始數幾位開始擷取,假設length為8,最終表示式為left('2018-03-23','8'),最終擷取以後得到的字串就是2018-03-.關於字串擷取參考mysql字串函式substring:字串擷取

concat

mysql中可以使用concat函式拼接多個字串,比如要把剛剛擷取的字串和25拼接到一塊的表示式就是concat('2018-03-','25'),這樣就得到了2018-03-25.關於concat參考mysql函式之四:concat() mysql 多個字段拼接和sql中字串拼接.補充一點,oracle和db2中可以使用||拼接字串,mysql中不行.

最終方案

方案概述

先使用current_date獲取當前日期,然後使用date_sub減去乙個月,left裁剪8位再拼接上25,這樣得到了區間的最小日期.再使用current_date獲取當前日期,left裁剪8位再拼接上24,這樣得到了區間的最大日期.

最終的sql

根據上面的思路得到的sql如下:

select * from productorder where create_date>=concat(left(date_sub(current_date,interval 1 month),'8'),'25')

and create_date<=concat(left(current_date,'8'),'24')

執行結果

執行上面的sql,結果如下:id  order_id  product_id  create_date  create_timestamp

2  1  1  2018-03-25  2018-03-25 23:33:33

3  1  1  2018-03-26  2018-03-26 23:33:33

4  1  1  2018-03-27  2018-03-27 23:33:33

5  1  1  2018-04-21  2018-04-21 23:33:33

6  1  1  2018-04-23  2018-04-23 23:33:33

7  1  1  2018-04-24  2018-04-24 23:33:33

執行sql的時間是4月23號晚上,對應的日期區間是3月25號到4月24號.可以看到3月25號之前和4月24號之後的資料都被過濾掉了。

mysql區間查詢 MySQL區間分組查詢

假設a表為會員資訊表,需要統計男性會員年齡各階段的出現的人數 create table a id int 11 unsigned not null auto increment,name varchar 255 not null default comment 會員名稱 tinyint 1 unsi...

mysql 分區間查詢 MySQL區間分組查詢

假設a表為會員資訊表,需要統計男性會員年齡各階段的出現的人數 create table a id int 11 unsigned not null auto increment,name varchar 255 not null default comment 會員名稱 tinyint 1 unsi...

mysql合併到區間 合併區間

lc 合併區間 給出乙個區間的集合,請合併所有重疊的區間。示例 1 輸入 intervals 1,3 2,6 8,10 15,18 輸出 1,6 8,10 15,18 解釋 區間 1,3 和 2,6 重疊,將它們合併為 1,6 示例 2 輸入 intervals 1,4 4,5 輸出 1,5 解釋 ...