2013-04-04 45 views
2

我使用抓取昨天的MySQL數據與訪問者的時區

SELECT COUNT(*) as total FROM track 
WHERE FROM_UNIXTIME(date,'%Y-%m-%d %h:%m:%s') > DATE_ADD(NOW(), INTERVAL -2 DAY) 
AND FROM_UNIXTIME(date,'%Y-%m-%d %h:%m:%s') < DATE_ADD(NOW(), INTERVAL -1 DAY) 

但是成功獲取昨天的MySQL數據,它使用服務器的時區。我的服務器位於美國,如果訪問者來自美國以外的其他時區(例如:亞洲或歐洲),我的昨日數據對於用戶而言是不正確的。我想根據訪問者的時區獲取正確的昨天結果。我可以在php中獲得訪問者時區,但我無法弄清楚如何在mySQL中使用它。

+0

嘗試此鏈接,你會找到你想要的東西。 http://stackoverflow.com/questions/1718935/how-do-i-get-a-visitors-time-zone-in-php – Ihab 2013-04-04 22:42:58

+0

我的問題是不是得到當前時區,但使用它在MySQL取數據時。 – user198989 2013-04-04 22:47:03

回答

5

不要將時間存儲爲UNIX時間戳,而應將其存儲爲TIMESTAMP。然後,你可以簡單地設置time_zone,當你希望一切都將轉換:

SET time_zone = '+10:00'; 

SELECT COUNT(*) AS total 
FROM track 
WHERE date > NOW() - INTERVAL 2 DAY 
    AND date < NOW() - INTERVAL 1 DAY 

否則,您可以使用CONVERT_TZ()

SELECT COUNT(*) AS total 
FROM track 
WHERE date > UNIX_TIMESTAMP(CONVERT_TZ(NOW() - INTERVAL 2 DAY, '+3:00', '+10:00')) 
    AND date < UNIX_TIMESTAMP(CONVERT_TZ(NOW() - INTERVAL 1 DAY, '+3:00', '+10:00')) 
+0

+1這是一個很好的例子! – nickhar 2013-04-04 22:54:54

+0

我只是打了一個repionse覆蓋相同的問題。如果您有任何關於在MySQL中查詢數據的設計,請勿使用UNIX TIMESTAMPS。在將查詢用於查詢之前,您需要將這些時間戳轉換爲MySQL日期時間,這意味着您將立即禁止使用索引進行查詢優化。這個答案中顯示的第一個查詢將能夠使用'date'上的索引,第二個查詢不會)。我還想說明,您可能只是想在UTC中使用UTC作爲所有日期的基礎,日期「字段,並將應用程序轉換爲本地用戶時間 – 2013-04-04 23:01:06

+0

@MikeBrant:請參閱我的修訂答案,其中索引可與第二個查詢一起使用(使用UNIX時間戳)。 – eggyal 2013-04-04 23:47:49