Mysql:将列从timestamp转换为int并为每次更新执行转换

时间:2017-08-07 18:04:14

标签: mysql sql

我有一个$ awk 'BEGIN{RS="\r\n"} {gsub(/\s*\n/," ")} 1' file | cat -v smith|Login|command line is my friend|2 oliver|Login|I have no idea why I am here|10 dennis|Payroll|are we there yet?|100 smith|Time|going to have some fun|200 smith|Logout|here I come|10 类型的现有数据库列,我需要将其修改为timestamp,但为了实现这一点,我需要在更改时转换每个时间戳值。< / p>

这是我的修改语句,目前无法正确转换时间戳:

INT(11)

有没有办法为alter命令提供转换功能?否则我以为我可以

  • 创建一个名为 updated_on_temp 的新列,类型为ALTER TABLE my_table MODIFY COLUMN updated_on INT(11) UNSIGNED NOT NULL;
  • 使用以下内容转换并复制所有时间戳:
INT(11) UNSIGNED NOT NULL
  • 删除UPDATE my_table SET updated_on_temp = UNIX_TIMESTAMP(updated_on);
  • updated_on重命名为updated_on_temp

第二种方式是唯一有效的方法吗?

2 个答案:

答案 0 :(得分:1)

这种方式不需要临时字段来存储时间戳类型的值,因此在大型表上进行更改时应该更加停机友好,并且通过删除 UNIX_TIMESTAMP() 也可以使用 DATE(TIME) 类型字段。

要将 int 转换回时间戳或日期时间,请参阅:Converting mysql column from INT to TIMESTAMP

首先,我们必须将时间戳类型转换为没有标点符号的数字日期时间(如 202102060020302),因为数字完整形式对于 int 存储来说太长,应该将字段更改为 bigint 类型:

ALTER TABLE `table` CHANGE `field` `field` BIGINT NOT NULL;

然后将 int 转换为数字日期时间等时间戳:

UPDATE `table` SET `field` = UNIX_TIMESTAMP(CAST(`field` AS DATETIME));

最后将字段类型从 bigint 修剪为 int,如果您不关心 2038 年问题:

ALTER TABLE `table` CHANGE `field` `field` INT NOT NULL;

参考https://dev.mysql.com/doc/refman/8.0/en/date-and-time-type-conversion.html

> mysql> SELECT CURTIME(), CURTIME()+0, CURTIME(3)+0;
> +-----------+-------------+--------------+
> | CURTIME() | CURTIME()+0 | CURTIME(3)+0 |
> +-----------+-------------+--------------+
> | 09:28:00  |       92800 |    92800.887 |
> +-----------+-------------+--------------+
> mysql> SELECT NOW(), NOW()+0, NOW(3)+0;
> +---------------------+----------------+--------------------+
> | NOW()               | NOW()+0        | NOW(3)+0           |
> +---------------------+----------------+--------------------+
> | 2012-08-15 09:28:00 | 20120815092800 | 20120815092800.889 |
> +---------------------+----------------+--------------------+

答案 1 :(得分:0)

您可以使用

功能
TIME_TO_SEC()

将时间值转换为秒