我有一个表,在此表中我有一个列,当前存储类型为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()
的内容
答案 0 :(得分:1)
您遇到第一个错误,因为DBMS无法即时转换列。第二个错误来自以下事实:UNIX_TIMESTAMP()
期望使用DATE
,TIME
或TIMESTAMP
string 而不是整数,因此您应该使用{{ 3}}。
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.
转换旧值并用它们填充新列:
UPDATE mytable SET new_column = FROM_UNIXTIME(old_column) WHERE old_column IS NOT NULL;
删除旧列:
ALTER TABLE mytable DROP COLUMN old_column;
将新列重命名为旧名称:
ALTER TABLE mytable CHANGE new_column old_column;
答案 1 :(得分:0)
例如,假设您具有时间戳1376750476349,并且要将其转换为日期时间。如果时间戳以秒为单位,则只需执行以下操作即可。
select FROM_UNIXTIME(timestamp_value);
但是,对于上述功能的许多用户来说,这是一个经常出现的问题,如果您的时间戳以毫秒为单位,则在使用该功能之前,您必须执行所需的转换,以秒为单位。因此,如果时间戳以毫秒为单位,则可以执行以下操作以获取日期时间:
select FROM_UNIXTIME(timestamp_value/1000);
希望这会有所帮助。享受吧!
答案 2 :(得分:-1)
您需要执行此操作作为多步操作:
我强烈建议优先使用DATETIME
TIMESTAMP
,因为TIMESTAMP
列仅适用于2038年然后爆炸。
UNIX_TIMESTAMP()
并未引用TIMESTAMP
列,但它们之间存在切向关联,因为TIMESTAMP
类型是time_t
类型UNIX&的包装器#34;时间戳"因此the 2038 limit。