从MySQL有效地查找日期范围

问题描述 投票:0回答:1

这是我的DiscountPeriod表的结构:

id
room_id
date_from
date_last
discount

想象一下,我们有01 December 2017的折扣,最后是在10 December 2017

我正在搜索日期范围以查看它是否有折扣。所以日期范围可能完全或部分在某些折扣期内。搜索的3个示例日期范围:

  • 12月2日至12月10日(完全在折扣期之一内)
  • 11月20日至12月4日(部分内部)
  • 12月5日至12月15日(部分内部)

预计上面所有3个例子都是从01 December 2017开始并以10 December 2017结束的折扣。

目前,我的查询只接受那些完全在数据库精确时段内的结果。

它看起来像这样:

SELECT * FROM `DiscountPeriod` WHERE (`room_id`=1517) AND (`date_last` >= '2017-12-12') AND (`date_from` <= '2017-12-20');

问题是,如何将所有3个可能的搜索案例整合到1个查询中,以便在MySQL数据库表中进行有效搜索?

Expected result is

以下所有范围:12月2日至12月10日,11月20日至12月4日,12月5日至12月15日应返回10月1日至10日折扣。

mysql database date select
1个回答
1
投票

这看起来像是重叠范围问题。如果您想要返回与2017年12月1日至10日重叠的所有折扣,请尝试以下查询:

SELECT *
FROM DiscountPeriod
WHERE
    room_id = 1517 AND
    '2017-12-01' <= date_last AND '2017-12-10' >= date_from;

这是一个使用您的测试数据的演示。您建议的所有三个折扣范围都显示在结果集中。但正如我们所预期的那样,完全在201​​7年12月1日至1日之外的范围不存在。

Demo

© www.soinside.com 2019 - 2024. All rights reserved.