MySQL的时间、日期型
MySQL中表示时间值的有DATE、时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个时间类型有一个有效值范围和一个“零”值,当指定不合法的MySQL不能表示的值时使用“零”值。
如果在数据表中插入一个不合法的日期,那么MySQL将给出警告或提示MySQL语法错误。不过可以使用ALLOW_INVALID_DATES SQL模式让MySQL接受某些日期,例如'1999-11-31'。
创建数据表,测试时间数据类型:
create table `date_test`(
`date_year` year, -- 格式:YYYY 或YY
`date_date` date, -- 格式:YYYY-MM-DD
`date_time` time, -- 格式:HH:MM:SS
`date_datetime` datetime,
-- 格式:YYYY-MM-DD空格HH:MM:SS
`date_timestamp` timestamp
-- 格式:YYYY-MM-DD空格HH:MM:SS
)charset utf8 comment '测试时间数据表';
当你想要保存一个“可能错误的”用户已经在数据库中指定(例如,以web形式)用于将来处理的值时很有用。在这种模式下,MySQL只验证月范围为从0到12,日范围为从0到31。这些范围可以包括零,因为MySQL允许在DATE或DATETIME列保存日/月和日是零的日期。这在应用程序需要保存一个你不知道确切日期的生日时非常有用。在这种情况下,只需要将日期保存为'1999-00-00'或'1999-01-00'。
-- 插入数据测试:
insert into `date_test` values
-- 时间日期型数据:录入的时候,都要加上引号
('2018', -- year类型
'2018-9-26', -- date类型
'19:18:29', -- time类型
'2018-9-26 10:15:16', -- datetime类型
'2018-9-26 10:15:16' -- timestamp类型
);
注意如果保存此类日期,DATE_SUB()或DATE_ADD等需要完整日期的函数不会得到正确的结果。(如果你不想在日期中出现零,可以使用NO_ZERO_IN_DATE SQL模式)。
'YYYY-MM-DD HH:MM:SS'或'YY-MM-DD HH:MM:SS'格式的字符串。允许“不严格”语法:任何标点符都可以用做日期部分或时间部分之间的间割符。例如,'98-12-31 11:30:45'、'98.12.31 11+30+45'、'98/12/31 11*30*45'和'98@12@31 11^30^45'是等价的。
insert into `date_test` values
-- 时间日期型数据:录入的时候,都要加上引号
('09', -- year类型
'2018-9-26', -- date类型
'-3 19:18:29', -- time类型
'2018-9-26 10:15:16', -- datetime类型
'2018-9-26 10:15:16' -- timestamp类型
);
'YYYY-MM-DD'或'YY-MM-DD'格式的字符串。这里也允许使用“不严格的”语法。例如,'98-12-31'、'98.12.31'、'98/12/31'和'98@12@31'是等价的。
insert into `date_test` values
-- 时间日期型数据:录入的时候,都要加上引号
('69', -- year类型
'2018-9-26', -- date类型
'-3 19:18:29', -- time类型
'2018-9-26 10:15:16', -- datetime类型
'2018-9-26 10:15:16' -- timestamp类型
);
'YYYYMMDDHHMMSS'或'YYMMDDHHMMSS'格式的没有间割符的字符串,假定字符串对于日期类型是有意义的。例如,'19970523091528'和'970523091528'被解释为'1997-05-23 09:15:28',但'971122129015'是不合法的(它有一个没有意义的分钟部分),将变为'0000-00-00 00:00:00'。
'YYYYMMDD'或'YYMMDD'格式的没有间割符的字符串,假定字符串对于日期类型是有意义的。例如,'19970523'和'970523'被解释为 '1997-05-23',但'971332'是不合法的(它有一个没有意义的月和日部分),将变为'0000-00-00'。
YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的数字,假定数字对于日期类型是有意义的。例如,19830905132800和830905132800被解释为 '1983-09-05 13:28:00'。
YYYYMMDD或YYMMDD格式的数字,假定数字对于日期类型是有意义的。例如,19830905和830905被解释为'1983-09-05'。
-- mysql8.0 将timestamp类型,自动跟随更新默认不更新
-- 更改为:自动跟随更新:
alter table date_test
modify -- 更新表数据类型
date_timestamp -- 列名
timestamp -- 新数据类型
default current_timestamp -- 默认值
on update current_timestamp -- 跟随更新
;
· 函数返回的结果,其值适合DATETIME、DATE或者TIMESTAMP上下文,例如NOW()或CURRENT_DATE。MySQL不接受在日或月列包括一个零或包含非法日期值的时间戳值。该规则的唯一例外是特殊值'0000-00-00 00:00:00'。你可以非常灵便地确定什么时候初始化和更新TIMESTAMP和对哪些列进行初始化和更新