2016-11-17 52 views
0

SQL語句:SQL查找即將舉行的日期和時間

SELECT * FROM table 
WHERE eventdate >= DATE(NOW()) 
AND eventtime > TIME(NOW()) 
ORDER BY eventdate ASC, eventtime ASC; 

的目標是選擇對接下來要來了該事件。只要在同一天沒有兩個事件,它就可以工作。例如:

Event 1, 11/17/2016 7:00am 
Event 2, 11/17/2016 2:00pm 
Event 3, 11/18/2016 9:00am 

我想選擇事件2,因爲它是在17日上午7:00通過的。上面的語句,還是會選擇事件1.

+3

請不要使用您未使用的數據庫標記此問題。我已經刪除了這些標籤。請僅添加您正在使用的數據庫的標籤。 –

+0

不知道我明白你在找什麼,但你可以添加一個限制2. – FDavidov

+0

我不想選擇事件1,因爲它已經發生了。但是上面的聲明選擇它。 –

回答

0

正如在註釋中所確定的,問題在於數據庫所在的服務器當前使用的時區。正因爲如此,並且您使用的是PHPmyAdmin,我相信您無權更改服務器時區。

你可能的解決方案是:

已在MST(UTC-07)或任何時區的服務器上
  • 使用當前數據和減去2小時或convert the data to a time zone
    • 使用數據
    • 重寫查詢以使用NOW()+ 2小時
    +0

    建議您刪除「更改(或查找誰可以更改)服務器時區」。這隻會將問題轉移到不在同一時區的其他用戶。順便說一句,這就是爲什麼在大多數情況下,將UTC日期/時間存儲在數據庫中是合理的,而不是本地日期/時間。每個人都同意當前的UTC時間... – user1429080

    +0

    已註釋和更新。當我不應該做出這樣的假設時,我的印象是這是一個個人項目。 – Fritz

    1

    這應該工作:

    SELECT * FROM table 
    WHERE eventdate > DATE(NOW()) 
    OR 
        (eventdate = DATE(NOW()) AND eventtime > TIME(NOW())) 
    
    ORDER BY eventdate ASC, eventtime ASC; 
    

    基本上你比較,如果日期是在未來(明天)或日期今天時間已過。

    如果你的日期在將來,你不關心在這種情況下的時間。

    試試吧。

    +0

    看起來問題是NOW()比兩個小時落後。有關如何改變EST時間的想法? –

    +0

    下面是答案:http://stackoverflow.com/questions/13916747/set-mysql-database-timezone-to-gmt – user2693928

    0

    我需要存儲在eventdateeventtimefieldstable在上下文中的示例中的值。因爲如果你正在檢查time > TIME(NOW()),如果時間過去了,它不應該選擇這個事件。

    +0

    下面是表中的快照:http://i.imgur.com/ulvwRin。 png –

    +0

    我看到第一個time定於8點06分,當時活動在上午7點。如果代碼在7:00和8:06之間運行,它也將在當天開始第一個事件。由於SQL語句使用的是NOW()函數,它是在服務器時間執行的函數,因此時區似乎不成問題。這完全取決於服務器的確切時間,以及事件地點和服務器時間之間是否有時間差。 –