2016-07-24 6 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'); 

は私を与える:

DATETIME値に対する

範囲を言ってdocumentationにもかかわらず

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) 

'1000-01-01 00:00:00.000000'

なぜ私はこのエラーを取得しています'9999-12-31 23:59:59.999999'にありますか?

+0

タイムゾーン、おそらく?これは奇妙なケースのように思えます... – ceejayoz

答えて

2

MySQLの場合はfractional secondsのドキュメントを参照し、MySQLバージョンに関する@Pieterのコメントに注意してください。

MySQLはマイクロ秒を廃棄しない格納されたが、マニュアル通りの以下の状況で使用することができるされ5.6.4前:

末尾小数部分は、リテラル値としてコンテキストで許容される、とでいくつかの時間関数に引数を渡すか、値を返します。

MySQL 5.6.4以降では、分数秒のサポートが拡張されました。

DATETIME列の分数秒(fsp)を定義しない限り、デフォルトは0(マイクロ秒なし)です。同じタイプの列に秒の小数部分とTIME、DATE、またはTIMESTAMP値を挿入するが、

を丸めに少ない小数点以下の桁の結果を持つ

:ドキュメントのこのコメントに基づいて

上記のコメントと失敗したINSERTに基づいた前提と理論は、.4またはさらには.499999(MySQL 5.6.4以降でサポートされる小数点以下6桁まで)は、の末尾で、です.5以上ラウンドしますup。秒整数または数値の整数部分になるだろうマイクロ秒が端数と考えられているので

、。 59.5を切り上げると、時間部分の範囲が00:00:00から23:59:59であるため、日付部分を変更する必要があります(1日前に移動)。この動作は、日付と時刻を調整する関数の外で予期しないものと考えることができます。

+0

これは今や理にかなっています。私は現時点で5.6.24を使用しています!説明ありがとう! – displayname

2

MySQL 5.6.4からTIME,DATETIMEおよびTIMESTAMPに分数秒のサポートが追加されました。そのバージョンの前には、タイムスタンプに秒数を追加することはできません(documentation参照)。

5.6.4より前のバージョンのMySQLを使用していますか?

関連する問題