如何查询指定时段用户持有物品 处理date_from和date_to默认值问题
正确查询方案
核心逻辑
你之前使用的date_from >= '查询起始' and date_to <= '查询结束'条件仅能匹配完全落在查询时间段内的持有记录,漏掉了三类符合要求的记录:
- 持有周期开始早于查询起始时间、结束在查询时间段内
- 持有周期开始在查询时间段内、结束晚于查询结束时间
- 持有周期完全覆盖整个查询时间段
本质是没有使用「时间区间重叠」的通用判断逻辑。
正确查询条件
只要持有周期和目标查询时间段存在重叠,即为符合要求的记录,判断逻辑为:持有记录的起始日期 ≤ 查询时间段的结束日期 且 持有记录的结束日期 ≥ 查询时间段的起始日期
该逻辑天然兼容2000-01-01的默认起始值、2099-12-31的默认当前持有结束值,无需额外适配。
示例SQL
查询Louis在2021-01-01到2021-12-31期间持有的所有物品,写法如下:
SELECT Owner, Item, date_from, date_to FROM 你的表名 WHERE Owner = 'Louis' AND date_from <= '2021-12-31' AND date_to >= '2021-01-01';
边界调整说明
以上条件默认包含日期端点,符合你给出的业务规则:
戒指(date_from=2000-01-01,date_to=2021-02-28)、帽子(date_from=2021-03-01,date_to=2021-10-31)、牛仔裤(date_from=2021-11-01,date_to=2099-12-31)三类场景均可正常命中。
如果你的业务定义中「归还当天不算持有」,可将第二个条件调整为date_to > '查询起始日期';如果「领取当天不算持有」,可将第一个条件调整为date_from < '查询结束日期',按需微调即可。
内容的提问来源于stack exchange,提问作者Louis Chopard
相关产品推荐
相关产品推荐

