2012-02-03 19 views
10

Kiedy byłem yound i głupi miał niewielki doświadczeniem, postanowiłam, że będzie to dobry pomysł, aby wygenerować znaczniki czasu w PHP i przechowywać je w INT kolumny w moim MySQL InnoDB tabeli. Teraz, gdy ta tabela ma miliony rekordów i potrzebuje zapytań opartych na datach, nadszedł czas, aby przekonwertować tę kolumnę na TIMESTAMP. Jak mam to zrobic?Konwersja kolumnę mysql z INT do TIMESTAMP

currenlty moja tabela wygląda następująco:

id (INT) | message (TEXT) | date_sent (INT) 
--------------------------------------------- 
1  | hello?   | 1328287526 
2  | how are you? | 1328287456 
3  | shut up  | 1328234234 
4  | ok    | 1328678978 
5  | are you...  | 1328345324 

Oto pytania wymyśliłem, aby przekształcić date_sent kolumna TIMESTAMP:

-- creating new column of TIMESTAMP type 
ALTER TABLE `pm` 
    ADD COLUMN `date_sent2` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(); 

-- assigning value from old INT column to it, in hope that it will be recognized as timestamp 
UPDATE `pm` SET `date_sent2` = `date_sent`; 

-- dropping the old INT column 
ALTER TABLE `pm` DROP COLUMN `date_sent`; 

-- changing the name of the column 
ALTER TABLE `pm` CHANGE `date_sent2` `date_sent` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(); 

Wszystko wydaje się poprawna do mnie, ale kiedy nadchodzi czas, aby uzyskać UPDATE pm date_sent2 = date_sent ;, Otrzymuję ostrzeżenie, a wartość znacznika czasu pozostaje pusta:

Co robię źle i czy istnieje sposób, aby to naprawić?

Odpowiedz

28

Jesteś prawie na miejscu, użyj FROM_UNIXTIME() zamiast bezpośrednio skopiować wartość.

-- creating new column of TIMESTAMP type 
ALTER TABLE `pm` 
    ADD COLUMN `date_sent2` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(); 

-- Use FROM_UNIXTIME() to convert from the INT timestamp to a proper datetime type 
-- assigning value from old INT column to it, in hope that it will be recognized as timestamp 
UPDATE `pm` SET `date_sent2` = FROM_UNIXTIME(`date_sent`); 

-- dropping the old INT column 
ALTER TABLE `pm` DROP COLUMN `date_sent`; 

-- changing the name of the column 
ALTER TABLE `pm` CHANGE `date_sent2` `date_sent` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(); 
+0

Dziękuję. Działa świetnie! –