2013-08-07 209 views
5

我需要將我們的MySQL(InnoDB)數據庫中的某些TIMESTAMP字段轉換爲INT。我意識到將TIMESTAMP轉換爲INT是不尋常的,但我們仍然需要這樣做:)將TIMESTAMP轉換爲INTEGER的Mysql - 時區

它似乎很直接,但有一些時區和夏令時錯誤。

我有一個腳本,每列生成我的SQL代碼。例如,它產生:

ALTER TABLE alarmLog ADD COLUMN started_tmp INT UNSIGNED; 
UPDATE alarmLog SET started_tmp = UNIX_TIMESTAMP(started); 
ALTER TABLE alarmLog DROP started; 
alter TABLE alarmLog CHANGE started_tmp started INT UNSIGNED NULL DEFAULT 0; 

如果我之前和使用select FROM_UNIXTIME(1291788036);,結果看起來不錯的數據後進行比較。

然後這個想法是改變所有的客戶端軟件轉換爲UTC,並在存儲它時使用INT。檢索時,該INT將轉換爲當前時區。

但隨後的文檔warn me有關此方案(在CET夏令):

mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00'); 
+---------------------------------------+ 
| UNIX_TIMESTAMP('2005-03-27 02:00:00') | 
+---------------------------------------+ 
|       1111885200 | 
+---------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00'); 
+---------------------------------------+ 
| UNIX_TIMESTAMP('2005-03-27 03:00:00') | 
+---------------------------------------+ 
|       1111885200 | 
+---------------------------------------+ 
1 row in set (0.00 sec) 

如何API和操作系統的正常處理夏令?我知道我的個人電腦有UTC時鐘,夏令時,操作系統增加了兩個小時,冬天時間增加了一個小時。我假設它使用UTC時間來確定它是否是DST。

那麼,我該如何處理?是唯一向數據庫添加字段以指定DST偏移量的解決方案嗎?

+1

夏令時是一個不同的時區。例如。 CET是中歐時間,CEST是中歐夏令時。您的操作系統知道何時切換。只要您使用UTC來表示時間戳,就由表示層將其轉換爲本地時間。 –

回答

3

您不需要在INT中存儲時間。 MySQL的TIMESTAMP類型無論如何都會這樣做(它使用標準的unix時間戳來存儲時間),並且它們始終使用UTC。

您只需要設置會話時區,當您更新/選擇它們時,所有TIMESTAMP列將從/轉換到您的區域。

您可以設置連接/初始化時,一旦區:

SET time_zone = '+10:00'; 

然後你就可以選擇/在你的區域更新時間直接

​​

我不是很熟悉日期時間庫,但我想他們使用您提供的時區和有問題的時間來確定時區和夏時制偏移量。

在你提供的例子中,我認爲其中一個值實際上是無效的,因爲時鐘從01:59:59跳到03:00:00和02:00:00從未真正發生過。在這種情況下,UNIX_TIMESTAMP函數可能返回最接近的秒數。

+0

我知道我可以使用時間戳,但我不能使用該類型。客戶端需要與sqlite兼容,因此轉換爲INT。關於無效的時間;在夏令時結束時,您每天會有兩次特定時間,這會產生同樣的問題。 – Halfgaar

+0

相同的字符串表示形式存在多個時間點,也存在差距。我不認爲你有什麼可以做的。將您的值存儲爲unix時間戳(INT),並使用MySQL的函數或時間庫客戶端將它們轉換爲本地時間。只要你已經正確設置時區,它應該正確顯示。 – Vatev

+0

我剛測試在TIMESTAMP列中插入'2005-03-27 02:00:00'。檢索它也給你'2005-03-27 03:00:00',所以我想這很好。 – Halfgaar

相關問題