一、前言
做項目時遇到需求,需要將車輛保險表的保險到期狀態給區分顯示(正常,即將到期,已過期),但是車輛保險表中並沒有這個狀態字段,所以得根據車輛保險時間去進行動態篩選出狀態信息。
二、IF()函數
MySQL中的IF()函數作用類似於Java中的三目運算符,個人感覺在實際開發中使用可以避免多餘的查詢;
- 表達式:IF(expr,value1,value2)
- 說明:根據expr得到的結果,true返回value1 ,false返回 value2;
- 示例:
SELECT
t1.ciId,
t1.coid,
t1.carName,
t1.carLossStartDate,
t1.compulsoryEndDate,
t1.businessStartDate,
t1.businessEndDate,
t1.carStatus,
t1.companyname
FROM
(
SELECT
t1.ciid,
t1.coid,
t2.carname,
t1.carLossStartDate,
t1.compulsoryEndDate,
t1.businessStartDate,
t1.businessEndDate,
-- 這裏使用if()函數進行了嵌套後達到需求效果,
-- 保險時間<當前時間or保險時間=null-已過期,
-- 當前時間<=保險時間<=兩個月後的當前時間-即將到期,
-- 否則則是-正常狀態;
-- 簡寫: if(expr1,'1',if(expr2,'2','0'))
-- 保險狀態說明 0-正常 1-已過期 2-即將過期
IF( ( t1.compulsoryEndDate < DATE_FORMAT( NOW( ), '%Y-%m-%d 00:00:00' ) ) or t1.compulsoryEndDate is null, '1',
IF(t1.compulsoryEndDate BETWEEN DATE_FORMAT(NOW(),'%Y-%m-%d 00:00:00') and DATE_FORMAT(DATE_ADD(NOW(),INTERVAL +2 MONTH),'%Y-%m-%d 00:00:00'),'2','0')) carStatus,
t1.companyname
FROM
vehicles_carinsurance t1
LEFT JOIN vehicles_car t2 ON t1.cid = t2.cid
WHERE
t2.is_delete = '0'
) t1
WHERE
t1.ciid = '67067'
and t1.carStatus = '2'
and t1.coid in ('16041')
ORDER BY
t1.compulsoryEndDate
- 這裏使用if()函數進行了嵌套後達到需求效果:
1. 保險時間<當前時間or保險時間=null-已過期,
2. 當前時間<=保險時間<=兩個月後的當前時間-即將到期,
3. 否則則是-正常狀態;
4. 簡寫: if(expr1,‘1’,if(expr2,‘2’,‘0’))
5. 保險狀態說明 0-正常 1-已過期 2-即將過期 - 結果: