我有2列的startdate和enddate类型为int。这些列用于存储时间戳数据。
现在我必须从这个时间戳中提取日期组件,将其转换回时间戳,将它存储在另一列int类型的startdate1中
但是在这样做的时候,我收到一条警告'数据在第一行的列startDate1被截断'。
sql查询是: -
ALTER TABLE `ServiceRule` ADD COLUMN `startDate1` INT(11) NULL DEFAULT NULL AFTER `endDate` , ADD COLUMN `endDate1` INT(11) NULL DEFAULT NULL AFTER `startDate1`;
update `ServiceRule` set `startDate1`= TIMESTAMP(DATE(from_unixtime(`startDate`)));
update `ServiceRule` set `endDate1`= TIMESTAMP(DATE(from_unixtime(`endDate`)));
现在,如果我将startDate1和endDate1的数据类型更改为TIMESTAMP,则startDate1的第一个更新查询将成功运行。 但endDate1更新查询显示警告'行'的列'endDate1'的超出范围值。
在浏览解决方案后,我知道如果输入值大于列数据类型范围,就会发生这种情况。
有人可以试着帮我吗? 提前致谢。 :)
答案 0 :(得分:2)
我认为你想要的是UNIX_TIMESTAMP
而不是TIMESTAMP
。
UNIX_TIMESTAMP
是FROM_UNIXTIME
的反函数。
答案 1 :(得分:1)
这意味着其中一行包含一个无法转换为int
的值,因为它实际上要比预期的要多得多或太少。
您是否只能将列转换为timestamp
并从那里进行提取?例如,尝试查询每组100,并缩小故障行。
答案 2 :(得分:1)
当字段startDate
的类型为int
时,使用的alter table
语句不正确,无法实现您想要的效果。
将其更改如下:
-- keeping the added fields as is, execute the following
ALTER TABLE `ServiceRule` MODIFY COLUMN `startDate1` DATETIME DEFAULT NULL;
ALTER TABLE `ServiceRule` MODIFY COLUMN `endDate1` DATETIME DEFAULT NULL;
update `ServiceRule` set `startDate1`= TIMESTAMP(DATE(from_unixtime(`startDate`)));
update `ServiceRule` set `endDate1`= TIMESTAMP(DATE(from_unixtime(`endDate`)));