Skip to content

类型 名称 字节 日期格式 最小值 最大值 YEAR 年 1 YYYY或YY 1901 2155 TIME 时间 3 HH:MM:SS -838:59:59 838:59:59 DATE 日期 3 YYYY-MM-DD 1000-01-01 9999-12-03 DATETIME 日期时间 8 YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 9999-12-31 23:59:59 TIMESTAMP 日期时间 4 YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:00 UTC 2038-01-19 03:14:07 UTC

为什么时间类型 TIME 的取值范围不是 -23:59:59~23:59:59 呢?原因是 MySQL 设计的 TIME 类型,不光表示一天之内的时间,而且可以用来表示一个时间间隔,这个时间间隔可以超过 24 小时。

  • YEAR

    以 4 位字符串或数字格式表示时,格式为 YYYY,最小值为 1901,最大值为 2155。 以 2 位字符串或数字格式表示时

    • 当取值为数字或字符串 01 到 69 时,表示 2001 到 2069。

    • 当取值为数字或字符串 70 到 99 时,表示 1970 到 1999。

    • 当为字符串 '0' 或 '00' 时,表示 2000 年。

    • 当为数字 0 或 00,表示 0000 年。

    sql
    CREATE TABLE table_year (
      x YEAR
    );
    
    INSERT INTO table_year
    VALUES 
    ('2021'), 
    (2022),
    ('69'),
    ('70'),
    ('0'),
    (0),
    ('00'),
    (00);
  • DATE

    YYYY-MM-DD 或 YYYYMMDD YY-MM-DD 或 YYMMDD

    sql
    CREATE TABLE table_date (
      x DATE
    );
    
    INSERT INTO table_date
    VALUES 
    ('2021-01-01'), 
    ('20210101'), 
    ('21-01-01'), 
    ('210101'),
    # 存在隐式转换
    (210101),
    (CURDATE()),
    (NOW());
  • TIME

    • D HH:MM:SS

      D 表示天,最小值为 0,最大值为 34。如果使用带有 D 格式的字符串,D会被转化为小时, HH 的值为 D * 24 + HH。

    • D HH:MM

    • D HH

    • HH:MM:SS

    • HH:MM

    • SS

    • HHMMSS

    sql
    CREATE TABLE table_time (
      x TIME
    );
    
    INSERT INTO table_time
    VALUES
    ('2 12:00:00'),
    ('12:00:00'),
    (NOW());
  • DATETIME

    YYYY-MM-DD HH:MM:SS 或 YYYYMMDDHHMMSS YY-MM-DD HH:MM:SS 或 YYMMDDHHMMSS

    sql
    CREATE TABLE table_datetime (
      x DATETIME
    );
    
    INSERT INTO table_datetime
    VALUES
    ('2021-01-01 12:00:00'),
    (CURTIME()),
    (NOW());
  • TIMESTAMP

    YYYY-MM-DD HH:MM:SS 或 YYYYMMDDHHMMSS YY-MM-DD HH:MM:SS 或 YYMMDDHHMMSS

    存储数据的时候需要对当前时间所在的时区进行转换,查询数据的时候再将时间转换回当前的时 区。因此,使用TIMESTAMP存储的同一个时间值,在不同的时区查询时会显示不同的时间。

    sql
    CREATE TABLE table_timestamp (
      t1 DATETIME,
      t2 TIMESTAMP
    );
    
    INSERT INTO table_timestamp
    VALUES
    ('2021-01-01 12:00:00', '2021-01-01 12:00:00'),
    (CURTIME(), CURTIME()),
    (NOW(), NOW());
    
    SELECT * FROM table_timestamp;
    +---------------------+---------------------+
    | t1                  | t2                  |
    +---------------------+---------------------+
    | 2021-01-01 12:00:00 | 2021-01-01 12:00:00 |
    | 2022-09-11 20:41:07 | 2022-09-11 20:41:07 |
    | 2022-09-11 20:41:07 | 2022-09-11 20:41:07 |
    +---------------------+---------------------+
    
    # 修改时区为东九区
    SET time_zone = '+9:00';
    
    # TIMESTAMP 类型显示该时间戳在东九区的时间
    +---------------------+---------------------+
    | t1                  | t2                  |
    +---------------------+---------------------+
    | 2021-01-01 12:00:00 | 2021-01-01 13:00:00 |
    | 2022-09-11 20:41:07 | 2022-09-11 21:41:07 |
    | 2022-09-11 20:41:07 | 2022-09-11 21:41:07 |
    +---------------------+---------------------+

TIMESTAMP vs DATETIME的

  • TIMESTAMP 存储空间比较小,表示的日期时间范围也比较小。

  • 底层存储方式不同,TIMESTAMP 底层存储的是毫秒值,距离 1970-1-1 0:0:0 0 毫秒的毫秒值。 两个日期比较大小或日期计算时,TIMESTAMP 更方便、更快。

  • TIMESTAMP 和时区有关。TIMESTAMP 会根据用户的时区不同,显示不同的结果。而 DATETIME 则只能反映出插入时当地的时区,其他时区的人查看数据会有误差的。

用得最多的日期时间类型,就是 DATETIME 。因为这个数据类型包括了完整的日期和时间信息,取 值范围也最大,使用起来比较方便。但一般存注册时间、商品发布时间等,不建议使用 DATETIME 存储,而是使用时间戳 ,因为 DATETIME 虽然直观,但不便于计算。