MySQL - 如何从最接近开始的点获得范围?

时间:2009-08-28 15:21:36

标签: mysql select

表格结构 -

int PrimaryKey
DateTime Date
int Price

我想要做的是传递开始和结束日期,并获得范围

发件人

小于或等于start UNLESS 的最大日期没有这样的日期,在这种情况下,范围的开头应该是可用的最低日期。

结束日期。

到目前为止,我的查询是:

SELECT Date, Price
FROM table1
WHERE Date <= $end
AND Date >= 
(
  SELECT Date
  FROM table1
  WHERE Date <= $start
  ORDER BY Date DESC
  LIMIT 1
)

子查询获得小于或等于起始值的最大日期,然后将其用作主查询范围的低端。在那里获得“UNLESS”条款的任何建议?

例如,给定一个包含日期的表:

Jan 1, 2009
Feb 1, 2009
Mar 1, 2009
Apr 1, 2009

我希望查询$start='Feb 18, 2009'$end='Apr 30, 2009'返回3行2月1日,3月1日,4月1日(2009年2月1日是小于或等于$ start的最大日期) )。

但是如果我提供$start='Dec 1, 2009'$end='Apr 30, 2009'我想要返回所有四行(没有小于或等于$ start的日期,所以范围从最低日期开始)

2 个答案:

答案 0 :(得分:1)

你不需要“ UNLESS 没有这样的日期,在这种情况下,范围的开始应该是可用的最低日期”逻辑,因为如果你只是选择$ start之后的所有日期如果没有上一个日期,您无论如何都会自动获得下一个最新日期。并且你已经知道$ start和下一个最新日期之间没有记录,所以不要试图排除它们!

WHERE Date BETWEEN coalesce((select max(date)
                               from table1
                              where date <= $start)
                            , $start) and $end

答案 1 :(得分:0)

为什么不将它与$开始日期进行比较?

SELECT Date, Price
FROM table1
WHERE Date <= $end
AND Date >=$start

我没有测试过,但似乎对我有用(如果我明白你想做什么)