2016-09-01 91 views
1

當前和下一個記錄我有這個表:MySQL的:獲取基於日期

+----+-----------+------------+------------+-----------+ 
| id | name | date_start | date_end | is_active | 
+----+-----------+------------+------------+-----------+ 
| 12 | Invernale | 2016-11-01 | 2017-03-31 |   1 | 
| 15 | Estivo | 2016-09-01 | 2016-09-01 |   1 | 
+----+-----------+------------+------------+-----------+ 

我需要根據當前和下一個記錄,根據目前得到的「當前」的記錄。

在我的例子,「當前」的ID 15和「下一個」將是12

今天,同樣的查詢將返回「NULL」(或者沒有記錄)爲下一電流和15。

在十一月01st 2016年,目前爲12和未來沒有記錄。

在四月01st 2017年都將需要返回任何記錄。

這是我的查詢,但都將返回ID 15(今天)。

$sql_current = "SELECT * FROM $table WHERE date_start <= '$now' AND date_end >= '$now'"; 

$sql_next = "SELECT * FROM $table WHERE date_start >= '$now' ORDER BY date_start ASC LIMIT 1"; 

非常感謝您

+0

**在我的例子, 「當前」 的ID 15和 「下一個」 將是15。**是正確的嗎?第三行。 – 1000111

+0

@ 1000111不,這是一個錯誤。剛剛編輯。謝謝! – sineverba

回答

0

我想你能得到這兩個記錄(如果有的話)與的UNION幫助單個查詢(如果我沒有誤會)

(
    SELECT 
    * 
    FROM tableName 
    WHERE CURDATE() BETWEEN date_start AND date_end 
    LIMIT 1 
) 
UNION 
(
    SELECT 
    * 
    FROM tableName 
    WHERE date_start > CURDATE() 
    ORDER BY date_start 
    LIMIT 1 
); 

編輯:

如果您想知道哪個條目是current哪一個是next那麼你可以添加一個額外的列currentOrNext象下面這樣:

(
    SELECT 
    *, 
    'current' AS currentOrNext 
    FROM tableName 
    WHERE CURDATE() BETWEEN date_start AND date_end 
    LIMIT 1 
) 
UNION 
(
    SELECT 
    *, 
    'next' AS currentOrNext 
    FROM tableName 
    WHERE date_start > CURDATE() 
    ORDER BY date_start 
    LIMIT 1 
) 
0

如果我理解正確的問題,你需要獲得一個包含當前日期(CURDATE() BETWEEN date_start AND date_end),這是在未來的第一時間間隔的時間間隔和不包含當前日期。

以下查詢:

SELECT * 
FROM tbl 
WHERE CURDATE() <= date_end 
ORDER BY date_end ASC 
LIMIT 2 

產生不過去的前兩個時間間隔(或更小)(終止日期是將來的)。

一對夫婦在客戶端代碼的代碼行(PHP可能)可查詢返回的第一行(如果有的話)的start_date值來決定它是否可以作爲「當前」或「下一個」:

  • 如果沒有行返回然後currentNULLnextNULL;
  • 否則,如果所述第一返回的行的start_date是過去然後current是所述第一返回的行和next是第二返回行(if any) or NULL`(只有一行被查詢返回);
  • 別的currentNULLnext是第一行和第二行(如果有的話)是不必要的。