2016-07-24 396 views
1

对于我的表admin_tool_functionality日期时间字段溢出,如果日期> '9999-12-31 23:59:59.4'

CREATE TABLE admin_tool_functionality (

    id BIGINT NOT NULL AUTO_INCREMENT, 

    admin_tool_functionality_type_id BIGINT NOT NULL, 

    CONSTRAINT fk__admin_tool_functionality__admin_tool_functionality_type 
     FOREIGN KEY (admin_tool_functionality_type_id) 
     REFERENCES admin_tool_functionality_type(id), 

    PRIMARY KEY (id, admin_tool_functionality_type_id), 

    price FLOAT NOT NULL, 

    valid_from_day DATETIME NOT NULL, 

    valid_until_day DATETIME NOT NULL, 

    CHECK(valid_from_day < valid_until_day) 

); 

这种插入正常工作:

INSERT INTO admin_tool_functionality 
    (admin_tool_functionality_type_id, price, valid_from_day, valid_until_day) 
VALUES 
    (1, 13.37, '2016-01-01', '9999-12-31 23:59:59.4'); 

但任何价值超过啤酒'9999-12-31 23:59:59.4'失败:

INSERT INTO admin_tool_functionality 
    (admin_tool_functionality_type_id, price, valid_from_day, valid_until_day) 
VALUES 
    (1, 13.37, '2016-01-01', '9999-12-31 23:59:59.5'); 

给予我:

Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Datetime function: datetime field overflow 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3964) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3902) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2526) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2673) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2545) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2503) 
    at com.mysql.jdbc.StatementImpl.executeInternal(StatementImpl.java:839) 
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:739) 

尽管documentation

的范围DATETIME值是'1000-01-01 00:00:00.000000''9999-12-31 23:59:59.999999'

为什么会出现这个错误?

+0

时区,也许?这似乎是一个奇怪的边缘情况下关心... – ceejayoz

回答

2

请参阅fractional seconds有关MySQL的文档,并注意关于MySQL版本的@Pieter注释。

的MySQL 5.6.4微秒被丢弃,并且不存储,但可以在下列情况下按照文档被使用之前:

结尾的部分的一部分是在上下文中如文字值可允许的,并且在参数或从某些时态函数返回值。

在MySQL 5.6.4之后或之后,扩展了小数秒的支持。

除非您为DATETIME列定义小数秒(fsp),否则它将默认为0,即无微秒。

基于该文档中此评论:

插入时间,日期,或时间戳和分数秒部分值到相同类型的一列,但在舍入

具有较少的小数位的结果

基于上述评论和您的失败​​INSERT的假设和理论是.4甚至0.499999(MySQL 5.6.4或更新版本支持的最多6个小数位)将围绕下降,而.5或更高将轮到向上

由于微秒被认为分数,它们将使得这个秒整数或数量的整个部分。如果59.5要整理,那么会导致日期部分不得不改变(向前移动1天),因为时间部分范围是00:00:0023:59:59。在调整日期和时间的函数之外,此行为可能被认为是意外的。

+0

好吧,这现在有道理。我目前正在使用5.6.24!感谢您的解释! – displayname

2

自从MySQL 5.6.4以来,已经为TIME,DATETIMETIMESTAMP添加了小数秒支持。在该版本之前,您不允许向时间戳添加小数秒(请参阅documentation)。

您是否有机会在5.6.4之前使用MySQL版本?

相关问题