2014-05-02 35 views
0

我有2列的startdate和enddate int类型。这些列用于存储时间戳数据。数据截断列startDate1在行

现在我要提取该时间戳的日期部分,将其转换回时间戳的储存于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'超出范围值。

浏览解决方案后,我知道如果输入值大于列数据类型范围,就会发生这种情况。

任何人都可以请尝试帮助我吗? 在此先感谢。 :)

回答

2

我想你想要的是UNIX_TIMESTAMP而不是TIMESTAMP

UNIX_TIMESTAMPFROM_UNIXTIME的反函数。

1

什么意思是其中一行包含无法转换为int的值,因为它确实比预期的要多或多少。

难道你不能只是将列转换为timestamp并从那里进行提取?例如,尝试查询每100个集合并缩小错误行。

1

当字段startDateint类型时,则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`)));