zoukankan      html  css  js  c++  java
  • 关于datetime,date,timestamp,year,time时间类型小结

    关于datetime,date,timestamp,year,time时间类型

     

    datetime占用8个字节

    日期范围:”1000-01-01 00:00:00” 到”9999-12-31 23:59:59”

     

    date占用3个字节

    可以显示范围:”1000-01-01” 到”9999-12-31”

     

    timestamp占用4个字节

     

    timestamp显示结果跟datetime一样,固定格式:”YYYY-MM-DD HH:MM:SS”

    不同的是:

    1,timestamp占用4个字节,显示的范围”1970-01-01 00:00:00”到”2038-01-19 03:14:17”.

    2,在建表时,列为timestamp的日期类型可以设置为一个默认值,而datetime不行。

    3,在更新表时,可以设置timestamp类型的列自动更新为当前时间。

    4,在一个表中,只能有一行指定的时间类型能指定为“TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP”,其他列的时间类型需要指定为” timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'”。

    示例1:

    CREATE TABLE t (a INT,b TIMESTAMP DEFAULT CURRENT_TIMESTAMP) ENGINE=INNODB CHARSET=utf8;

    SHOW CREATE TABLE t;

    INSERT INTO t(a) VALUES (1);

     

    root@python 17:04>SELECT * FROM t;

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

    | a    | b                   |

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

    |    1 | 2012-12-13 17:03:58 |

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

     

    示例2:

    CREATE TABLE `t2` (

      `a` INT(11) DEFAULT NULL,

      `b` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

    ) ENGINE=INNODB DEFAULT CHARSET=utf8;

     

    //插入数据

    root@python 17:07>insert into t2 select 1,current_timestamp;

    Query OK, 1 row affected (0.00 sec)

    Records: 1  Duplicates: 0  Warnings: 0

     

    root@python 17:07>select * from t2;

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

    | a    | b                   |

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

    |    1 | 2012-12-13 17:07:25 |

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

    1 row in set (0.00 sec)

     

    //稍微等待一下

    root@python 17:07>update t2 set a=100;

    Query OK, 1 row affected (0.00 sec)

    Rows matched: 1  Changed: 1  Warnings: 0

     

    root@python 17:08>select * from t2;

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

    | a    | b                   |

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

    |  100 | 2012-12-13 17:08:16 |

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

    1 row in set (0.00 sec)

     

    发现update操作后,更改了a列的值,b列的时间有原来的“2012-12-13 17:07:25” 更新为” 2012-12-13 17:08:16”。

     

    //如果update操作更新a列的值,而实际没有改变行中的任何数据,因此b列的不会进行相应的操作。请看实例3。

     

    实例3:

    root@python 17:08>select * from t2;

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

    | a    | b                   |

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

    |  100 | 2012-12-13 17:08:16 |

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

    1 row in set (0.00 sec)

     

    root@python 17:11>update t2 set a=100;

    Query OK, 0 rows affected (0.00 sec)

    Rows matched: 1  Changed: 0  Warnings: 0

     

    root@python 17:11>select * from t2;

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

    | a    | b                   |

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

    |  100 | 2012-12-13 17:08:16 |

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

    1 row in set (0.00 sec)

     

    总结下:在使用timestamp类型时,由于目前程序中时间不为NULL时,是程序赋值的。请在制定timestamp类型时,不要指定“TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP”,而指定“TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP”。这样就不会造成更新数据导致时间的更改。

     

    yeartime类型

     

    year类型只占用1个字节,对于year(4),显示的年份范围为1901-2155;year(2)显示年份范围为1970-2070。

     

    time类型占用3个字节

     

    概要:时间类型本着够用的原则,可以用timestamp就千万不要用datetime,可以用year的就不要用datetime,或则date类型。

  • 相关阅读:
    mysql_wp_replication_tutorial
    Procedure execution failed 2013
    [Err] 1136
    innodb_flush_log_at_trx_commit和sync_binlog 参数说明
    mysql没有oracle 那样一次性把data buffer 数据写入磁盘
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field
    MyEclipse之Widget is disposed
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Query was empty
    An internal error occurred during: "Building workspace". GC overhead limit exceeded
    Oracle 内部复制文档解读
  • 原文地址:https://www.cnblogs.com/wnlja/p/4147096.html
Copyright © 2011-2022 走看看