2013-06-20 64 views
0

我已經有了一個超過50.000日期的表,我需要將它轉換爲時間戳字段。根據日期字段更新時間戳列

基本tablelayout:

Fieldname    Type 
+------------------------+-----------+ 
| calendar_date   | DATE  | 
| calendar_unixtimestamp | TIMESTAMP | 
+------------------------+-----------+ 

所以基本上:

update calender set calendar_unixtimestamp = UNIX_TIMESTAMP(calendar_date) 

然而,慣於工作着,當然。所以我試過另一個選項,這個選項在一些愚蠢的網站上告訴我,似乎是合乎邏輯的。但是不能得到它的工作:

update 
    calendar t1 
    join calendar t2 on t2.`calendar_date` = t1.`calendar_date` 
set 
    t1.calendar_unixtimestamp = UNIX_TIMESTAMP(t2.`calendar_date`) 
where 
    t1.`calendar_date` = t2.`calendar_date` 

有人嗎?

+0

爲什麼你說它不起作用?怎麼了?是calendar_date日期列或varchar列? – fthiella

+0

當然,對不起。它只是不會更新任何東西。沒有發生任何事情我添加了表格結構 –

回答

0

TIMESTAMP數據類型用於包含日期和時間部分的值,而UNIX_TIMESTAMP返回無符號整數。

您應該將calendar_unixtimestamp設置爲INT。

請參閱小提琴here

+0

現貨!謝謝你的朋友 –

0

本傑明。

我不是MySQL的專家,但我認爲你應該閱讀:

http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html

特別是當它說:

默認情況下,第一個TIMESTAMP列同時如果沒有明確指定DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP。

的上UPDATE子句使字段值改變爲當前的時間戳每當記錄被更新,讓你更新它,然後它會自動更改爲當前時間戳,相同(或幾乎)所有記錄在你的表中。

也許你需要的是DATETIME列。時間戳列旨在記錄何時創建和/或更新。這對於多種用途很有用,包括多個用戶嘗試更新相同記錄時的安全性或衝突解決方案。 a)如果這是你需要的,你應該先禁用ON UPDATE觸發器,然後進行更新(你的第一個是OK),然後重新創建觸發器(*)。只需添加WHERE條件以確保您不會嘗試更新空值。再次,我不確定unix_timestamp是您需要的功能。

 
    UPDATE calendar 
    SET calendar_timestamp = TIMESTAMP(calendar.date) 
    WHERE calendar_date IS NOT NULL 

b)如果不是,您只需將新列的類型更改爲DATETIME。 (*)注意:可能會更容易刪除列,然後使用DEFAULT子句創建它,但沒有ON UPDATE子句或指定NULL子句。

+0

謝謝你的加入隊友,但是。重點是,即時通訊運行時間戳輸出到一個jFlot腳本,並需要時間戳。我不希望每個選擇從blabla有一個選擇unix_timestamp(日期)。這就是我想更新所有欄目的原因。時間戳的默認值的確是current_timestamp() –

+0

那麼,你應該檢查你是否也有ON UPDATE觸發器。如果有,則應刪除該列,然後使用DEFAULT CURRENT_TIMESTAMP()條件重新創建它,但不要使用ON UPDATE。否則,您將無法更新該字段。對不起,我的帖子中的所有修改。我只是新的stackoverflow :) – Clon