我有一个$ awk 'BEGIN{RS="\r\n"} {gsub(/\s*\n/," ")} 1' file | cat -v
smith|Login|command line is my friend|2
oliver|Login|I have no idea why I am here|10
dennis|Payroll|are we there yet?|100
smith|Time|going to have some fun|200
smith|Logout|here I come|10
类型的现有数据库列,我需要将其修改为timestamp
,但为了实现这一点,我需要在更改时转换每个时间戳值。< / p>
这是我的修改语句,目前无法正确转换时间戳:
INT(11)
有没有办法为alter命令提供转换功能?否则我以为我可以
ALTER TABLE my_table
MODIFY COLUMN updated_on INT(11) UNSIGNED NOT NULL;
INT(11) UNSIGNED NOT NULL
UPDATE my_table
SET updated_on_temp = UNIX_TIMESTAMP(updated_on);
列updated_on
重命名为updated_on_temp
第二种方式是唯一有效的方法吗?
答案 0 :(得分: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));
最后将字段类型从 bigint 修剪为 int,如果您不关心 2038 年问题:
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 |
> +---------------------+----------------+--------------------+
答案 1 :(得分:0)
您可以使用
功能TIME_TO_SEC()
将时间值转换为秒