Mysql高级查询 - 日期范围表每天结果列

时间:2013-03-18 12:07:17

标签: mysql sql date date-range

我在这里遇到了挑战。

我有一张看起来像这样的表。

| DayDate    |EndDate    |  Rate  | 
-----------------------------------
| 2013-07-01 |2013-08-05 | 200.00 | 
| 2013-08-06 |2013-10-20 | 150.00 | 
| 2013-10-21 |2013-12-31 | 130.00 | 

我喜欢运行一个查询,该查询应该返回给定日期范围内的每日费率值。 例如,我想查询从2013-08-03到2013-08-08的每日费率,预期结果应如下所示。

|   From    |   To      |  Day 1  |  Day 2  |  Day 3  |  Day 4  |  Day 5  |
---------------------------------------------------------------------------
|2013-08-03 |2013-08-08 | 200.00  |  200.00 |  150.00 |  150.00 |  150.00 |

在我的项目范围内,添加到列中的天数不会超过30天,通常平均为3到10天。我希望看到一些很酷的想法和有效的方法来生成如上所述的结果。

更新

为避免日期列混淆,查询会生成搜索周期之间天数的日期列。

感谢。

1 个答案:

答案 0 :(得分:0)

假设:您有一个静态日历表,其中包含一列DAY_DT和每个日期一行。 我在我的例子中称它为CAL_DAY,因为它与我们在数据仓库中使用的名称相同。

使用以下查询,您只需在主查询中添加新的MAX()列,并使用更多CASE语句来扩展查询以反映更大的范围。

SELECT MAX(MIN_DAY_DT), 
  MAX(MAX_DAY_DT), 
  MAX(D1) AS "Day 1",
  MAX(D2) AS "Day 2",
  MAX(D3) AS "Day 3",
  MAX(D4) AS "Day 4",
  MAX(D5) AS "Day 5"
FROM(
  SELECT cmin.DAY_DT AS MIN_DAY_DT,
    cmax.DAY_DT AS MAX_DAY_DT,
    CASE WHEN cd.DAY_DT = cmin.DAY_DT + 1 THEN rt.Rate ELSE 0 END AS "D1",
    CASE WHEN cd.DAY_DT = cmin.DAY_DT + 2 THEN rt.Rate ELSE 0 END AS "D2",
    CASE WHEN cd.DAY_DT = cmin.DAY_DT + 3 THEN rt.Rate ELSE 0 END AS "D3",
    CASE WHEN cd.DAY_DT = cmin.DAY_DT + 4 THEN rt.Rate ELSE 0 END AS "D4",
    CASE WHEN cd.DAY_DT = cmin.DAY_DT + 5 THEN rt.Rate ELSE 0 END AS "D5"
FROM CAL_DAY cd
  JOIN CAL_DAY cmin
    ON (cd.DAY_DT >= cmin.DAY_DT)
  JOIN CAL_DAY cmax
    ON (cd.DAY_DT <= cmax.DAY_DT)
  LEFT JOIN RateTable rt ON
    (cd.DAY_DT BETWEEN rt.DayDate AND rt.EndDate)
WHERE cmin.DAY_DT = '2013-08-03' 
  AND cmax.DAY_DT = '2013-08-08')