mysql timestamp 转换 int,将mysql列从INT转换为TIMESTAMP

  • Post author:
  • Post category:mysql


When I was yound and stupid had little experiance, I decided it would be a good idea, to generate timestamps in PHP and store them in INT column in my MySQL innodb table. Now, when this table has millions of records and needs some date-based queries, it is time to convert this column to TIMESTAMP. How do I do this?

Currenlty, my table looks like this:

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

Here are the queries I came up with, to convert date_sent column to 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();

Everything seems correct to me, but when time comes for the UPDATEpmSETdate_sent2=date_sent;, I get a warning and timestamp value remains empty:

+———+——+————————————————–+

| Level | Code | Message |

+———+——+————————————————–+

| Warning | 1265 | Data truncated for column ‘date_sent2’ at row 1 |

What am I doing wrong and is there a way to fix this?

解决方案

You’re nearly there, use FROM_UNIXTIME() instead of directly copying the value.

— 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();