MySQL 所有支持的时间与日期类型如下表:

对于所有时间与日期类型

  1. 所有的时间与日期类型都有对应的零值,当你指定一个非法的值的时候,该列会被赋值为对应的零值。
  2. MySQL 把所有时间与日期的类型都用标准格式来输出,但是你输入值的时候,MySQL 支持多种输入的时间格式。
  3. 尽管 MySQL 会用多种方式来解析输入的日期与时间,但是日期格式必须得按照年-月-日这个格式来输入,比如2018-04-16而不是04-16-2018
  4. 当 MySQL 遇到一个超过类型有效值范围的数值时,会把它转换为类型对应的零值,有一个类外是Time类型,它会发生截断。
  5. MySQL 运行 Date 与 DateTime 类型的月、日部分为0,如(1993-0-0)这个是被允许的,除非你打开了NO_ZERO_DATE模式

合法的时间与日期输入格式

MySQL 接受多种日期与时间的输入格式,包括字符串和数字。比如在 MySQL 期待一个日期的地方,所有形如'2018-04-16''20180416'20180416都会解析成日期。

标准 SQL 格式如下:

DATE 'str'
TIME 'str'
TIMESTAMP 'str'

标准 ODBC 格式如下:

{d	'str'}
{t	'str'}
{ts	'str'}

MySQL 用这些格式分别构造出日期、时间、时间戳类型的数值,注意的是,当使用标准 SQL 格式或 ODBC 格式构造时间戳(TimeStamp)时,构造出来的是DateTime类型,而不是TimeStamp,因为标准 SQL 的TimeStamp类型,更像 MySQL 里面的DateTime,而不像 MySQL 的TimeStamp

字符串和数字字面量形式如下

  1. 任何形如'YYYY-MM-DD''YY-MM-DD' 的字符串都可以解析为Date,其中的”-“可以替换成任意分隔符号。
  2. 任何形如'YYMMDD''YYYYMMDD'字符串数字,都能解析为 Date
  3. 任何形如'YYYY-MM-DD HH:MM:SS''YY-MM-DD HH:MM:SS'的字符串,都能解析为 DateTime 或者 TimeStamp,其中”-“可以替换为任意分隔符。
  4. 任何形如'YYYYMMDDHHMMSS''YYMMDDHHMMSS'字符串数字,都能解析为DateTime或者TimeStamp
  5. 不管怎样的格式,DateTimeTimeStamp如果时间有小数部分,那么时间的整数与小数部分必须要用小数点来分隔,如2018^04^16 12^26:32.123456是合法的,2018^04^16 12^26:32:123456则不行
  6. 如果没有分隔符,那必须保证,年月日时分秒都不能少于两位数,如果有分隔符则没有这个限制。例如,'2018911'不合法,'20180911'或者'2018-9-11'则是合法的。

DateTime 与 TimeStamp 的区别

  1. 数据有效范围不同,DateTime的有效范围是'1000-01-01 00:00:00''9999-12-31 23:59:59'TimeStamp的有效范围是 '1970-01-01 00:00:01''2038-01-19 03:14:07'
  2. 存储行为不同,TimeStamp会把当前输入转换为 UTC 时区,然后再保存的数据库,而检索的时候,又会转换成当前连接设置的时区时间来显示
  3. DateTimeTimeStamp默认都是允许 NULL的,但是,当你赋值NULL给一个类型为TimeStamp的有NOT NULL属性的列时,该列会被赋值为当前的时间,DateTime则不会有这样的特性,如果你给一个NOT NULLDateTime赋值为 NULL 系统会报错。(5.1版本是这样,其它版本行为可能会不同)
  4. 表的第一个TimeStamp列,如果你没有指定Default,那么MySQL 会自动为这个列添加 Default current_timestamp on update current_timestamp的属性。DateTime则不会有这个现象。 (5.1版本是这样,其它版本行为可能会不同