--mysql使用<>时,会将null也过滤,要先将null转为非nullSELECT*FROM test WHERE IFNULL(xxname,'')!='xxx'unionall 会按照顺序将各个字段合起来,所以每个unionall的表的字段要顺序要相同
--开窗函数求空档期,MySQL8.0以上版本适用--lead()方法:取当前数据的下一条数据 test--创建表和数据CREATETABLE`test`(`id`int(11)NOTNULL,`Mdate datetime`datetimeDEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8;INSERTINTO test(id,Mdate)VALUES('1','2021-11-01'),('1','2022-01-01'),('1','2022-01-15'),('1','2022-02-01'),('1','2022-02-03'),('1','2022-03-01'),('1','2022-03-05'),('1','2022-03-18'),('2','2021-11-01'),('2','2022-01-01'),('2','2022-01-15'),('2','2022-02-01'),('3','2022-02-03'),('3','2022-03-01'),('4','2022-03-05'),('5','2022-03-18');SELECT
id,
开始时间,
下一次订单时间,
datediff(下一次订单时间,开始时间)as 间隔天数
from(SELECT
id,
Mdate as 开始时间,
lead ( Mdate,1,NOW())OVER(partitionBY id ORDERBY Mdate ASC) 下一次订单时间
FROM test )T
--在上面的基础上求最大空档期--mysql版本不是8.0以上的SELECT
T1.id as id,
T1.Mdate 开始时间,
T2.Mdate AS 下一次订单时间,MIN( DATEDIFF( T2.Mdate, T1.Mdate )) 间隔天数
FROM
test T1
INNERJOIN(SELECT
id,Mdate
FROM
test
UNIONALLSELECTDISTINCT
id,NOW()AS Mdate
FROM test
) T2 ON T1.id = T2.id
AND T1.Mdate < T2.Mdate
GROUPBY
T1.id,T1.Mdate