假設現在有這樣乙個需求: 資料庫中有一張產品訂單表,表中有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 解釋 ...