将BigInt转换为MySQL中的时间戳

时间:2018-05-17 20:46:25

标签: mysql

我有一个表,在此表中我有一个列,当前存储类型为BigInt的值,我想更改此列以包含' timestamp'价值而不是。

我怎样才能做到这一点。我试过了:

ALTER TABLE t
MODIFY c TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

我得到了:

#1292 - Incorrect datetime value: '1524120113' for column 'created_temp' at row 1

并且

ALTER TABLE share ADD created_temp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
UPDATE share SET created_temp = UNIX_TIMESTAMP(created);

我得到了:#1292 - Incorrect datetime value: '1524120113'

使用created

创建UNIX_TIMESTAMP()的内容

3 个答案:

答案 0 :(得分:1)

您遇到第一个错误,因为DBMS无法即时转换列。第二个错误来自以下事实:UNIX_TIMESTAMP()期望使用DATETIMETIMESTAMP string 而不是整数,因此您应该使用{{ 3}}。

UNIX_TIMESTAMP()文档对这两个功能之间的区别有重要说明:

  

如果您使用UNIX_TIMESTAMP()和FROM_UNIXTIME()在TIMESTAMP值和Unix时间戳值之间进行转换,则转换是有损耗的,因为在两个方向上映射都不是一对一的。例如,由于本地时区更改的约定,两个UNIX_TIMESTAMP()可能会将两个TIMESTAMP值映射到相同的Unix时间戳值。 FROM_UNIXTIME()将该值仅映射回原始TIMESTAMP值之一。

-

这是完成任务所需的步骤(由于要重写所有行,因此可能需要很长时间!):

  1. 向您的数据库添加新列:

    ALTER TABLE mytable ADD new_column TIMESTAMP NULL; 
    -- PS: You might want to use a default value instead of NULL here.
    
  2. 转换旧值并用它们填充新列:

    UPDATE mytable SET new_column = FROM_UNIXTIME(old_column) WHERE old_column IS NOT NULL;
    
  3. 删除旧列:

    ALTER TABLE mytable DROP COLUMN old_column;
    
  4. 将新列重命名为旧名称:

    ALTER TABLE mytable CHANGE new_column old_column;
    

答案 1 :(得分:0)

例如,假设您具有时间戳1376750476349,并且要将其转换为日期时间。如果时间戳以秒为单位,则只需执行以下操作即可。

select FROM_UNIXTIME(timestamp_value);

但是,对于上述功能的许多用户来说,这是一个经常出现的问题,如果您的时间戳以毫秒为单位,则在使用该功能之前,您必须执行所需的转换,以秒为单位。因此,如果时间戳以毫秒为单位,则可以执行以下操作以获取日期时间:

select FROM_UNIXTIME(timestamp_value/1000);

希望这会有所帮助。享受吧!

source

答案 2 :(得分:-1)

您需要执行此操作作为多步操作:

  • 向数据库添加新列。
  • 使用转换后的值填充它。
  • 删除旧列。

强烈建议优先使用DATETIME TIMESTAMP,因为TIMESTAMP列仅适用于2038年然后爆炸。

UNIX_TIMESTAMP()并未引用TIMESTAMP列,但它们之间存在切向关联,因为TIMESTAMP类型是time_t类型UNIX&的包装器#34;时间戳"因此the 2038 limit