在做項目的時候遇到過一個問題,用戶需要獲取當前月或者幾個月的數據,但是有一個要求,如果已經存在一張單已經包含了這幾個月的數據,那麼就不能再提取到重覆的數據。 其實這個問題,我做完了我的方式之後才發現,有兩種方式。 第一種:在獲取到的數據上添加標識位,如果有單據已經占用了該數據,就在提取的時候根據標識 ...
在做項目的時候遇到過一個問題,用戶需要獲取當前月或者幾個月的數據,但是有一個要求,如果已經存在一張單已經包含了這幾個月的數據,那麼就不能再提取到重覆的數據。
其實這個問題,我做完了我的方式之後才發現,有兩種方式。
第一種:在獲取到的數據上添加標識位,如果有單據已經占用了該數據,就在提取的時候根據標識排除,這種方法要考慮到表的設計,業務的連續。(此種不舉例)
第二種:根據時間來進行判斷,判斷的邏輯較為複雜,主要是考慮到再次想建立的時間區間不能包含或大於已存在的單(其中有一個邏輯,如果新建的單的開始時間大於已存在的單開始時間且新建的單的結束時間小於已存在的單的結束時間,那麼新建單的開始時間和結束時間必定包含於已存在的單的時間區間之內。故只需要判斷,是否存在已存在的單的開始結束時間區間包含新建單的開始時間或包含結束時間,或新建單的開始時間小於已存在單的開始時間且新建單的結束時間大於已存在單的結束時間,邏輯比較亂,如果業務用不到,不存在時間區間的概念,可以不考慮第二種方法。採用上一種);
mybatis sql如下:
and ( reconStartDate BETWEEN #{reconStartDate,jdbcType=DATE} and #{reconEndDate,jdbcType=DATE}
or reconEndDate BETWEEN #{reconStartDate,jdbcType=DATE} and #{reconEndDate,jdbcType=DATE}
<![CDATA[ or reconStartDate <= ]]> #{reconStartDate,jdbcType=DATE} <![CDATA[ and reconEndDate >= ]]> #{reconEndDate,jdbcType=DATE} )