2013-03-27 147 views
0

我試圖做一個查詢,但經過幾小時的嘗試後,我似乎無法得到它的權利。我想要做的是從數據庫中顯示1個事件,該數據庫最接近當前日期&時間和當前日期&時間。與當前日期和時間顯示最接近的結果(MySQL和PHP)

我的專欄是這樣的:

date   time 
1364399654  15:00 
1364684400  16:00 
1367272800  12:00 

我的PHP是這樣的:

$timestamp_now = strtotime(date('d-m-Y')); //Creates a timestamp of the currect date 
$time_now = date('H:i'); 
$sql = mysql_query('SELECT * FROM table_name ORDER BY date ASC, time ASC (WHERE date > '.$timestamp_now.') AND (time > "'.$time_now.'") LIMIT 1') or die(mysql_error()); 
$data = mysql_fetch_array($sql); 

但是,這是行不通的。任何建議的話?

+0

請詳細準確地會發生什麼,「這行不通」,是不是非常有幫助! – 2013-03-27 15:11:17

+0

這不起作用,因爲它在沒有錯誤的情況下返回空。 – Resitive 2013-03-27 15:13:32

回答

4

我會拋棄使用PHP日期/時間的方法,依靠的MySQL給人一種查詢,看起來像

SELECT * FROM table_name 
WHERE date > CURRENT_DATE 
OR (
    date = CURRENT_DATE 
    AND 
    time > CURRENT_TIME 
) 
ORDER BY date ASC, time ASC LIMIT 1 

的OR確保它從第二天開始得到正確的記錄別人的時間部分會阻礙即結果在03:00出現,如果當前時間爲06:00

我看到您在那裏使用時間戳記值,因此您始終可以通過PHP日期數字代替CURRENT_DATE。這將使的

$timestamp_now = strtotime(date('d-m-Y')); //Creates a timestamp of the currect date 
$sql = mysql_query('SELECT * FROM table_name 
        WHERE date > '.$timestamp_now.' 
        OR (
         date = '.$timestamp_now.' 
         AND 
         time > CURRENT_TIME 
        ) 
        ORDER BY date ASC, time ASC LIMIT 1') or die(mysql_error()); 
$data = mysql_fetch_array($sql); 

我會建議考慮改變數據庫中,如果可以存儲就像一個MySQL DATETIME場最後的劇本,作爲那麼你可以改變這個查詢簡單地WHERE datetime > NOW(),但是這完全取決於你。總是發現MySQL的日期處理比PHP更合理。

+0

偉大的答案,謝謝你的意見。這個竅門! – Resitive 2013-03-27 15:22:34

0

我beleive你需要獲得的SQL結構與WHERE ORDER BY 像

SELECT * FROM table WHERE (date>$now) and (time>$now) ORDER BY date,time LIMIT 1 
1

你應該用一個更考驗:

  • DATE(date) > CURDATE():如果是明天或以後
  • DATE(date) = CURDATE() AND time > TIME(NOW()):它是今天,但後來

的完整代碼:

$sql = mysql_query('SELECT * 
        FROM table_name 
        WHERE DATE(date) > CURDATE() 
        OR (DATE(date) = CURDATE() AND time > TIME(NOW())) 
        ORDER BY date ASC, time ASC 
        LIMIT 1' 
       ) or die(mysql_error()); 
$data = mysql_fetch_array($sql); 

請注意,您在中使用了時間戳字段。時間戳包括日期時間,所以也許你就可以使用這個請求:

SELECT * 
FROM table_name 
WHERE date > NOW() 
ORDER BY date ASC 
LIMIT 1 
+0

由於需要將DATE()函數應用於所有記錄以確定哪些符合條件,這將導致表掃描。此外,訂單是在錯誤的地方。 ORDER在WHERE之後和LIMIT之前。 – 2013-03-27 15:20:36

+0

感謝您指出'ORDER'的不良位置。對於'DATE()'函數,我會讓這個代碼因爲它是基於原始問題。我提供了一個更好的方法來找到最接近我的答案的結果。 – zessx 2013-03-27 15:22:33