给定一个日期,发现MySQL中的前一个& /或当前和下一个x#日期是非线性的

时间:2011-07-25 06:46:09

标签: mysql sql stored-procedures date

我有一张表code_prices看起来像这样:

CODE   |   DATE     | PRICE
ABC    | 25-7-2011  |  2.81
ABC    | 23-7-2011  |  2.52
ABC    | 22-7-2011  |  2.53
ABC    | 21-7-2011  |  2.54
ABC    | 20-7-2011  |  2.58
ABC    | 17-7-2011  |  2.42
ABC    | 16-7-2011  |  2.38

数据集的问题是日期有差距,所以我可能想在18日查找项目ABC的价格,但没有条目,因为该项目在此日期尚未售出。所以我想以最优惠的价格返回最新的heotrical条目。

如果我在日期19-7-2011查询,我想在17日返回条目,然后返回下10个可用条目。

但是,如果我在20日查询ABC的价格,我会想要在20日之后返回价格以及之后的10个价格......

在SQL语句或使用存储过程中,最有效的方法是什么。

我可以想到只编写一个存储过程,它将日期作为参数,然后查询所有行,其中DATE> = QUERY-DATE按日期排序,然后选择11项(通过限制)。然后基本上我需要看看该集合是否包含当前日期,如果它然后返回,否则我将需要从这11个中返回10个最近的entires并且还在表格上执行另一个查询以通过获取返回先前的条目日期的最大日期<查询日期。我想可能有更好的方法,但我不是SQL专家(显然)......

谢谢!

2 个答案:

答案 0 :(得分:2)

我不清楚你想要达到什么目标,但无论如何我都会去。这将搜索包含小于或等于指定日期的日期的行的ID。然后,它使用该ID返回ID大于或等于该值的所有行。它假定您有一个除日期列以外的列,可以在其上订购行。这是因为你说日期是非线性的 - 我假设你必须有其他方式来排序行。

  SELECT id, code, dt, price
    FROM code_prices
   WHERE id >= (
  SELECT id
    FROM code_prices
   WHERE dt <= '2011-07-24'
ORDER BY dt DESC
   LIMIT 1 )
ORDER BY id
   LIMIT 11;

替代代码条件 - 感谢@ypercube突出显示; - )

  SELECT id, code, dt, price
    FROM code_prices
   WHERE code = 'ABC'
     AND id >= (
  SELECT id
    FROM code_prices
   WHERE dt <= '2011-07-23'
     AND code = 'ABC'
ORDER BY dt DESC
   LIMIT 1 )
ORDER BY id
   LIMIT 11;

答案 1 :(得分:2)

这是针对一个特定代码:

SELECT code, `date`, price
FROM code_prices
WHERE code = @inputCode
  AND `date` >=
        ( SELECT MAX(`date`)
          FROM code_prices
          WHERE code = @inputCode
            AND `date` <= @inputDate
        )
ORDER BY `date`
LIMIT 11

对于ABC19-7-2011,您将在上面给出17-7-2011行和后续10行(20-7-201121-7-2011等)< / p>