优化结算区间费用查询 SQL 条件

- 将时间比较逻辑从 BETWEEN改为 >= 和 <= 操作符
- 使用 DATE() 函数提取日期进行比较,确保时间比较的准确性
- 简化跨区间租赁条件,提高 SQL 可读性
This commit is contained in:
syruan 2025-09-06 17:49:47 +08:00
parent 9662ab772d
commit a6c49841f1
1 changed files with 9 additions and 10 deletions

View File

@ -1197,33 +1197,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!-- 已结算协议:租赁期间与查询区间有交集 -->
(bai.is_slt = 1 AND (
<!-- 情况1领料时间在查询区间内 -->
(sai.start_time IS NOT NULL AND sai.start_time BETWEEN #{startDate} AND #{endDate})
(sai.start_time IS NOT NULL AND DATE(sai.start_time) &gt;= #{startDate} AND DATE(sai.start_time) &lt;= #{endDate})
OR
<!-- 情况2退料时间在查询区间内 -->
(sai.end_time IS NOT NULL AND sai.end_time BETWEEN #{startDate} AND #{endDate})
(sai.end_time IS NOT NULL AND DATE(sai.end_time) &gt;= #{startDate} AND DATE(sai.end_time) &lt;= #{endDate})
OR
<!-- 情况3结算时间在查询区间内 -->
(sai.slt_time IS NOT NULL AND sai.slt_time BETWEEN #{startDate} AND #{endDate})
(sai.slt_time IS NOT NULL AND DATE(sai.slt_time) &gt;= #{startDate} AND DATE(sai.slt_time) &lt;= #{endDate})
OR
<!-- 情况4跨区间租赁领料在区间前退料/结算在区间后) -->
(sai.start_time IS NOT NULL AND sai.start_time &lt; #{startDate} AND
((sai.end_time IS NOT NULL AND sai.end_time &gt; #{endDate}) OR
(sai.slt_time IS NOT NULL AND sai.slt_time &gt; #{endDate})))
(sai.start_time IS NOT NULL AND DATE(sai.start_time) &lt; #{startDate} AND
((sai.end_time IS NOT NULL AND DATE(sai.end_time) &gt; #{endDate}) OR (sai.slt_time IS NOT NULL AND DATE(sai.slt_time) &gt; #{endDate})))
))
OR
<!-- 未结算协议:租赁期间与查询区间有交集 -->
((bai.is_slt = 0 OR bai.is_slt IS NULL) AND (
<!-- 情况1领料时间在查询区间内 -->
(sai.start_time IS NOT NULL AND sai.start_time BETWEEN #{startDate} AND #{endDate})
(sai.start_time IS NOT NULL AND DATE(sai.start_time) &gt;= #{startDate} AND DATE(sai.start_time) &lt;= #{endDate})
OR
<!-- 情况2退料时间在查询区间内 -->
(sai.end_time IS NOT NULL AND sai.end_time BETWEEN #{startDate} AND #{endDate})
(sai.end_time IS NOT NULL AND DATE(sai.end_time) &gt;= #{startDate} AND DATE(sai.end_time) &lt;= #{endDate})
OR
<!-- 情况3跨区间租赁领料在区间前退料在区间后或未退料 -->
(sai.start_time IS NOT NULL AND sai.start_time &lt; #{startDate} AND (sai.end_time IS NULL OR sai.end_time &gt; #{endDate}))
(sai.start_time IS NOT NULL AND DATE(sai.start_time) &lt; #{startDate} AND (sai.end_time IS NULL OR DATE(sai.end_time) &gt; #{endDate}))
OR
<!-- 情况4设备状态为在用未退料且领料时间不晚于查询结束时间 -->
(sai.status = '0' AND sai.start_time IS NOT NULL AND sai.start_time &lt;= #{endDate})
(sai.status = '0' AND sai.start_time IS NOT NULL AND DATE(sai.start_time) &lt;= #{endDate})
))
)
</where>