【问题标题】:Data truncated for column startDate1 at row行中 startDate1 列的数据被截断
【发布时间】:2014-05-02 07:17:43
【问题描述】:

我有两列 int 类型的 startdate 和 enddate。这些列用于存储时间戳数据。

现在我必须从这个时间戳中提取日期部分,将其转换回时间戳并将其存储在 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' 的值超出范围”。

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

任何人都可以尝试帮助我吗? 提前致谢。 :)

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

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

    UNIX_TIMESTAMPFROM_UNIXTIME 的反函数。

    【讨论】:

      【解决方案2】:

      这意味着其中一行包含一个无法转换为int 的值,因为它确实比预期的多或少。

      您不能将列转换为timestamp 并从那里进行提取吗?例如,尝试查询每组 100 个并缩小错误行。

      【讨论】:

        【解决方案3】:

        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`)));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-30
          • 2013-04-20
          • 2014-01-09
          • 2021-03-14
          • 1970-01-01
          • 2013-12-24
          • 2021-08-19
          相关资源
          最近更新 更多