0

我需要找到一种更好更快的方法来查询 MySQL 表以获取给定日期范围内每一天的特定数据,其中表有两个日期列指定开始日期和结束日期。

表示例:促销列:

ID   startDate     EndDate     Discount     CategoryID  
=============================================================
1    2010/08/01    2010/08/10     10.00        A
2    2010/08/01    2010/08/10     15.00        B
3    2010/08/11    2010/08/15     05.00        A
4    2010/08/11    2010/08/15     10.00        B

我知道当给出两个日期范围时,我可以从以下查询中获取匹配促销

SELECT * FROM Promotions WHERE (startDate <= "2010/08/12" AND endDate >= "2010/08/15") AND CategoryID = A

上述查询的结果将获取 ID 为 3 的行

但是,如果上述查询中的两个日期范围更改为如下所示

SELECT * FROM Promotions WHERE (startDate <= "2010/08/12" AND endDate >= "2010/08/18") AND CategoryID = A

我没有得到任何匹配的结果,因为我可以理解逻辑与表中存储的任何数据都不匹配。

这就是为什么,我需要一个更好的解决方案,即使结束日期超过促销的结束日期,我也可以获得匹配的结果。但是更改逻辑不会给我最好的答案,假设如果我使用以下查询可以得到结果,但是如果我需要找到日期范围内每一天的有效折扣,这也不能解决我的整个问题.

SELECT * FROM Promotions WHERE (startDate <= "2010/08/12" AND CategoryID = A

我需要的真正结果是一种将此查询转换为循环或使用内存中的临时 MySQL 表来获取每天的结果的方法,如下所示。

结果我需要找到日期范围 2010/08/12 到 2010/08/18

===================================================================
Date           Discount    
=========================
2010/08/12      05.00
2010/08/13      05.00
2010/08/14      05.00
2010/08/15      05.00
2010/08/16      null
2010/08/18      null

我希望我的问题和问题得到很好的解释,如果您需要有关此问题的任何进一步说明,请告诉我。

希望看到一个很好的答案。

4

2 回答 2

1

要查询日期范围内的项目,请使用:

SELECT * 
FROM Promotions 
WHERE (startDate >= "2010/08/12" AND endDate <= "2010/08/15") 
AND CategoryID = A

您希望开始日期大于或等于,结束日期小于或等于。

于 2010-08-02T15:37:18.147 回答
1

您需要一个看起来像这样的日期日历表:

Create Table Calendar ( [Date] DateTime Not Null Primary Key )

该表将是静态的,并且只需要填充一次。它将包含每一天的一行,涵盖您要查询的任何日期范围。这样,您的查询就更简单了:

Select C.Date, P.Discount
From Calendar As C
    Left Join Promotions As P
        On C.Date Between P.StartDate And P.EndDate
            And P.Category = 'A'
于 2010-08-02T15:49:39.170 回答