我有一个表,在这个表中我有一列当前存储一个类型的值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()
您遇到第一个错误是因为 DBMS 无法即时转换列。第二个错误是来自这样一个事实UNIX_TIMESTAMP()需要一个DATE,TIME或TIMESTAMP 字符串,而不是整数,所以你应该使用FROM_UNIXTIME()。
UNIX_TIMESTAMP() 文档对这两个函数之间的区别有一个重要的说明:
如果您使用 UNIX_TIMESTAMP() 和 FROM_UNIXTIME() 在 TIMESTAMP 值和 Unix 时间戳值之间进行转换,则转换是有损的,因为在两个方向上映射不是一对一的。例如,由于本地时区更改的约定,两个 UNIX_TIMESTAMP() 可以将两个 TIMESTAMP 值映射到同一个 Unix 时间戳值。FROM_UNIXTIME() 将该值仅映射回原始 TIMESTAMP 值之一。
——
以下是您完成任务所需的步骤(可能需要很长时间才能完成,因为必须重写所有行!):
向数据库添加一个新列:
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)转换旧值并用它们填充新列:
UPDATE mytable SET new_column = FROM_UNIXTIME(old_column) WHERE old_column IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)删除旧列:
ALTER TABLE mytable DROP COLUMN old_column;
Run Code Online (Sandbox Code Playgroud)将新列重命名为旧名称:
ALTER TABLE mytable CHANGE new_column old_column;
Run Code Online (Sandbox Code Playgroud)例如,假设您有时间戳,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)
希望这可以帮助。享受!
| 归档时间: |
|
| 查看次数: |
6378 次 |
| 最近记录: |