エラーテストmysql時間の減少の問題(bug)

4574 ワード

この文章を書く前に、xxxはすでにいくつかの間違いテストのテーマについての文章を書いたことがあります.知りたい人は前の文章をめくってもいいです.
    
mysql時間の減少の問題(bug)
明日宁青の学友の1本の微博を见て、mysqlの日付の相减の间违った结果に言及して、前にあまり気をつけていないで、そこでテストして、発明は确かにとても穴のお父さんで、とても雷を踏むことができて、そこで客博を整理してみんなにヒントを与えます.まず、誤った光景を見ると、第1条が正しく、第2、第3条のt 2-t 1が正しくない.
mysql> select t1,t2,t2-t1 from mytest;

+---------------------+---------------------+-------+

| t1                  | t2                  | t2-t1 |

+---------------------+---------------------+-------+

| 2013-04-21 16:59:33 | 2013-04-21 16:59:43 |    10 |

| 2013-04-21 16:59:33 | 2013-04-21 17:00:33 |  4100 |

| 2013-04-21 16:59:33 | 2013-04-21 17:59:35 | 10002 |

+---------------------+---------------------+-------+

3 rows in set

全体テストの本足は以下の通りです.
--   

mysql> CREATE TABLE mytest (

  t1 datetime,

  t2 datetime

);

Query OK, 0 rows affected

--      

mysql> insert into mytest(t1,t2) values('2013-04-21 16:59:33','2013-04-21 16:59:43');

Query OK, 1 row affected



mysql> insert into mytest(t1,t2) values('2013-04-21 16:59:33','2013-04-21 17:00:33');

Query OK, 1 row affected



mysql> insert into mytest(t1,t2) values('2013-04-21 16:59:33','2013-04-21 17:59:35');

Query OK, 1 row affected

--    

mysql> select t1,t2,t2-t1 from mytest;

+---------------------+---------------------+-------+

| t1                  | t2                  | t2-t1 |

+---------------------+---------------------+-------+

| 2013-04-21 16:59:33 | 2013-04-21 16:59:43 |    10 |

| 2013-04-21 16:59:33 | 2013-04-21 17:00:33 |  4100 |

| 2013-04-21 16:59:33 | 2013-04-21 17:59:35 | 10002 |

+---------------------+---------------------+-------+

3 rows in set

現実はmysqlの時間の相殺は1つの暗黙的な転換をして体操をして、時間を数に変換して、しかし実はunix_ではありませんtimestamp変換ではなく、年月日分秒を直接つなぎ合わせて、2013-04-21 16:59:33のように20130421165933に直接変換します.時間は十進法ではないので、最後に得た結果は意味がありません.これも次の穴のお父さんの結果になります.
毎日同じ理屈
成熟は1种の明るくてまぶしくない辉きで、1种の丸くて耳に饱きない音响で、1种は他の人に颜を见る必要がない余裕で、1种はついに周囲に诉える大気を止めて、1种は騒ぐ微笑みを相手にしないで、1种は偏激な淡漠を洗って、1种は声张する必要がない厚実で、1种は実は急峻ではありません高さ.
mysql> select t1,

       t2,

       convert(t1, UNSIGNED INTEGER) ct1,

       convert(t2, UNSIGNED INTEGER) ct2,

       t2-t1,

       convert(t2, UNSIGNED INTEGER) -convert(t1, UNSIGNED INTEGER) diff0

  from mytest; 

+-------------------+-------------------+--------------+--------------+-----+-----+

|t1                 |t2                 |ct1           |ct2           |t2-t1|diff0|

+-------------------+-------------------+--------------+--------------+-----+-----+

|2013-04-21 16:59:33|2013-04-21 16:59:43|20130421165933|20130421165943|   10|   10|

|2013-04-21 16:59:33|2013-04-21 17:00:33|20130421165933|20130421170033| 4100| 4100|

|2013-04-21 16:59:33|2013-04-21 17:59:35|20130421165933|20130421175935|10002|10002|

+-------------------+-------------------+--------------+--------------+-----+-----+

3 rows in set

正確な時間に秒値を減算するには、1、time_to_sec(timediff(t2, t1)),2、timestampdiff(second, t1, t2),3、unix_timestamp(t2) -unix_timestamp(t1)
--    

mysql> select t1,

       t2,

       t2-t1,

       time_to_sec(timediff(t2, t1)) diff1,

       timestampdiff(second, t1, t2) diff2,

       unix_timestamp(t2) -unix_timestamp(t1) diff3

  from mytest;

+---------------------+---------------------+-------+-------+-------+-------+

| t1                  | t2                  | t2-t1 | diff1 | diff2 | diff3 |

+---------------------+---------------------+-------+-------+-------+-------+

| 2013-04-21 16:59:33 | 2013-04-21 16:59:43 |    10 |    10 |    10 |    10 |

| 2013-04-21 16:59:33 | 2013-04-21 17:00:33 |  4100 |    60 |    60 |    60 |

| 2013-04-21 16:59:33 | 2013-04-21 17:59:35 | 10002 |  3602 |  3602 |  3602 |

+---------------------+---------------------+-------+-------+-------+-------+

3 rows in set

この問題は2003年にmysql 4にある.0のバージョンはフィードバックですが、mysql公式はバグとは思いません.mysqlは時間の直接的な減算をサポートしていないと思っているので、専用関数で処理すべきだと思っていますので、直一は修正していません.しかし、これは誤りを直接報告するか、明確な結果を示すか、使いやすいと思います.
私の新浪微博http://weibo.com/yzsind
文章は终わってみんなに次のプログラマーのいくつかのジョークの语录を分かち合います:あなたはあなたの彼女(あるいはいかなる女性)にあなたと李彦宏の间から1つを选ばせて、あなたは彼女が谁を选ぶと思いますか?答え:李艶紅という負け犬のため、私は彼女がいません!