【问题标题】:Mysql: Convert column from timestamp to int and perform conversion for each updateMysql:将列从时间戳转换为int并为每次更新执行转换
【发布时间】:2017-08-07 18:04:14
【问题描述】:

我有一个timestamp 类型的现有数据库列,我需要将其修改为INT(11),但为了实现这一点,我需要在更改每个时间戳值时对其进行转换。

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

ALTER TABLE my_table
MODIFY COLUMN updated_on INT(11) UNSIGNED NOT NULL;

有没有办法为 alter 命令提供转换功能或其他东西?否则我认为我可以

  • 创建一个新列,名为 updated_on_temp,类型为 INT(11) UNSIGNED NOT NULL
  • 转换和复制所有时间戳:

UPDATE my_table
SET updated_on_temp = UNIX_TIMESTAMP(updated_on);

  • 删除updated_on
  • updated_on_temp 重命名为updated_on

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

【问题讨论】:

  • 为什么?将值 a) 转换为可按需访问的类型似乎相当愚蠢 b) 包含较少的信息 c) 不能在不转换回其原始类型的情况下进行操作

标签: mysql sql


【解决方案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));

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

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 |
> +---------------------+----------------+--------------------+

【讨论】:

    【解决方案2】:

    您可以使用该功能

    TIME_TO_SEC()
    

    将时间值转换为秒

    【讨论】:

      猜你喜欢
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 2011-01-05
      • 2010-11-07
      • 2013-09-27
      • 2021-06-03
      • 1970-01-01
      相关资源
      最近更新 更多