2012-09-21 105 views
4

這裏的表users的一個簡單的版本:MySQL的:獲取本地時間的特定時間區

+--------------+-------------------+ 
|  id  |  timezone  | 
+--------------+-------------------+ 
|  1  | 'Europe/Helsinki' | 
|  2  | 'Europe/Paris' | 
+--------------+-------------------+ 

我想知道什麼是對這些用戶中的每一個本地時間(這取決於他們的時區) ,以便我可以選擇用戶是誰,例如下午4點。我正在使用LAMP堆棧,但我想這樣做只使用MySQL(不選擇所有用戶並在PHP循環中運行它們)。

+0

爲什麼不使用CONVERT_TZ? http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_convert -tz – Nin

+0

因爲我顯然是個笨蛋。知道我的MySQL服務器在法國,'SELECT CONVERT_TZ(NOW(),'Europe/Paris','America/New_York')'工作得很好!請在這個問題上添加一個答案,說明這一點,我會接受它。 – Pioul

+1

我經常在星期五的下午有這個:) – Nin

回答

4

你可以改變set time_zone時區:

mysql> set time_zone='Europe/Helsinki'; 
mysql> select now(); 
2012-09-21 16:15:06 
mysql> set time_zone='Europe/Paris'; 
mysql> select now(); 
2012-09-21 15:15:40 

使用這個就可以了,例如,定義返回當前時間爲用戶的時區功能:

create function current_time_in_tz(tz varchar(40)) returns datetime 
begin 
set @old_tz = @@session.time_zone; 
set time_zone=tz; 
set @now = now(); 
set [email protected]_tz; 
return @now; 
end 

select id, current_time_in_tz(timezone) from users; 

注意DATE ,TIME和DATETIME值不依賴於時區,因此查詢時不會自動調整這些類型的列中的值。 TIMESTAMP值調整:

mysql> create temporary table tbl (dt datetime, ts timestamp); 
mysql> insert into tbl values (now(),now()); 
mysql> select * from tbl; 
+---------------------+---------------------+ 
| dt     | ts     | 
+---------------------+---------------------+ 
| 2012-09-21 15:21:56 | 2012-09-21 15:21:56 | 
+---------------------+---------------------+ 
mysql> set time_zone='Europe/Helsinki'; 
mysql> select * from tbl; 
+---------------------+---------------------+ 
| dt     | ts     | 
+---------------------+---------------------+ 
| 2012-09-21 15:21:56 | 2012-09-21 16:21:56 | 
+---------------------+---------------------+ 

如果set time_zone失敗,此錯誤:

ERROR 1298 (HY000): Unknown or incorrect time zone: 'Europe/Helsinki' 

你需要的時區信息加載到MySQL與這樣的命令:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql 

對於更多信息請參閱http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html

+0

我已經閱讀了手冊的這一部分,並沒有幫助。我需要在單個查詢中處理多個時區,我不能通過聲明連接/服務器/系統變量來實現。 – Pioul

+0

您可以創建一個函數來設置變量,並在查詢中調用該函數...請參閱更新。 – Joni

+0

這會工作,但@ nin的答案是我正在尋找的。謝謝你! – Pioul

0

一個更通用(不依賴於服務器的時區),比寧的回答的解決辦法是:

SELECT * FROM users WHERE hour(CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', timezone))=16 

這將是很好如果MySQL有一個功能類似NOW_TZ(時區) 。