高级MySQl查询以获取同一表中的日期特定记录

时间:2010-08-02 15:32:53

标签: mysql date loops temp-tables date-range

我需要找到一种更好,更快捷的方法来查询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

我需要的真正结果是将此查询转换为循环或使用memmory中的临时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

我希望我的问题和问题得到很好的解释,如果您需要进一步澄清这个问题,请告诉我。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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'