2009-08-28 66 views
1

表結構 -MySQL - 如何獲得從最接近點開始的範圍?

int PrimaryKey 
DateTime Date 
int Price 

我想這樣做的是通過在開始和結束日期,並獲得一系列

最大日期小於或等於開始除非沒有這樣的日期,在這種情況下,範圍的開始應該是可用的最低日期。

的結束日期。

我的查詢到目前爲止是:

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'查詢返回三行2月1日,3月1日,4月1日(2009年2月1日是全國最大的日期即小於或等於$ start)。

但是,如果我提供$start='Dec 1, 2009'$end='Apr 30, 2009'我希望所有四行返回(沒有日期小於或等於$開始,所以範圍內的最低日開始)

回答

1

你不需要「除非有沒有這樣的日期,在這種情況下,範圍的開始應該是可用的最低日期「邏輯,因爲如果您只是在沒有先前日期的情況下選擇$開始後的所有日期,則無論如何您都會自動獲得下一個最新日期。而且您已經知道$ start和下一個最新日期之間沒有記錄,所以請勿嘗試排除它們!

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

現在測試這個,coalesce看起來確實是我需要的。 – Johrn 2009-08-28 15:41:03

+0

一旦我停止按照整數傳遞日期,就像夢一樣工作。<感謝一百萬! – Johrn 2009-08-28 15:50:51

0

你爲什麼不將它與$開始日期進行比較?

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

我沒有測試它,但它似乎爲我工作(如果我知道你想要做什麼)

+0

這並沒有捕獲我想要範圍啓動/之前/ $開始參數如果沒有完全在開始日期。我會用一些預期行爲的例子來編輯我的原作。 – Johrn 2009-08-28 15:30:09

相關問題