在 MySQL 中将 BigInt 转换为时间戳

Lar*_*sen 6 mysql

我有一个表,在这个表中我有一列当前存储一个类型的值BigInt,我想改变这个列以包含“时间戳”值。

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

ALTER TABLE t
MODIFY c TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)

我得到:

#1292 - Incorrect datetime value: '1524120113' for column 'created_temp' at row 1
Run Code Online (Sandbox Code Playgroud)

ALTER TABLE share ADD created_temp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
UPDATE share SET created_temp = UNIX_TIMESTAMP(created);
Run Code Online (Sandbox Code Playgroud)

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

的内容created是使用创建的UNIX_TIMESTAMP()

Hig*_* E. 6

您遇到第一个错误是因为 DBMS 无法即时转换列。第二个错误是来自这样一个事实UNIX_TIMESTAMP()需要一个DATETIMETIMESTAMP 字符串,而不是整数,所以你应该使用FROM_UNIXTIME()

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.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 转换旧值并用它们填充新列:

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

    ALTER TABLE mytable DROP COLUMN old_column;
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将新列重命名为旧名称:

    ALTER TABLE mytable CHANGE new_column old_column;
    
    Run Code Online (Sandbox Code Playgroud)


Baw*_*tha 6

例如,假设您有时间戳,1376750476349并且想将其转换为日期时间。如果您的时间戳在seconds.

select FROM_UNIXTIME(timestamp_value);
Run Code Online (Sandbox Code Playgroud)

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

select FROM_UNIXTIME(timestamp_value/1000);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。享受!

来源