MySQL的时间、日期型

时间:2023-12-12 08:23:38

MySQL的时间、日期型

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和对哪些列进行初始化和更新