日期与时间

日期与时间是比较常见的数据类型,但它们属于组合数据,处理起来相对复杂一些;本文将讨论MySQL数据库中的日期和时间数据类型,以及如何获取日期和时间,如何推算日期和时间,如何格式化日期和时间数据等。

日期和时间数据类型

MySQL数据库支持的日期和时间类型包括:

  • datetime类型,处理日期和时间数据,处理范围'1000-01-01 00:00:00.000000'到'9999-12-31 23:59:59.499999',常用格式为'yyyy-mm-dd HH:MM:SS',注意日期和时间之间有一个空格。
  • date类型,处理日期数据,格式为'yyyy-mm-dd'。处理范围为'1000-01-01'到'9999-12-31'。
  • time类型,处理时间数据,处理范围为'-838:59:59.000000'到'838:59:59.000000',常用格式为'HH:MM:SS'。
  • timestamp类型,可处理日期和时间数据,但处理范围比datetime小,并不经常直接使用。处理范围为格林尼治时间'1970-01-01 00:00:01.000000'到'2038-01-19 03:14:07.499999'。
  • year类型,处理2位或4位年份数据,并不常用。

在MySQL代码中使用日期或时间的直接量时,应和字符串一样使用一对单引号定义,如'2026-01-01 12:25:39'、'2026-03-15'、'09:35:59'等。

除了timestamp类型,在数据表中还可以使用一些自动保存和更新数据的时间戳类型,如:

  • timestamp default current_timestamp,记录创建时自动保存为系统当前时间。
  • timestamp default current_timestamp on update current_timestamp,添加或修改记录数据时自动更新为系统当前时间。
  • timestamp on update current_timestamp,修改记录数据时自动更新为当前系统时间。
  • timestamp default 'yyyy-mm-dd hh:mm:ss' on update current_timestamp,添加记录时保存为指定的时间,修改记录数据时自动更新为系统当前时间。

获取日期和时间数据

下面介绍一些获取日期和时间信息的函数,首先是获取系统日期和时间的函数:

  • Now()函数,获取系统当前日期和时间。默认情况下不包含微秒数据,但可以通过参数指定时间精度,如指定参数为6可以获取包含微秒的数据,指定参数为3返回精确到毫秒的数据。
  • CurDate()函数,获取系统当前日期。
  • CurTime()函数,获取系统当前时间。同样可以使用参数指定时间的精度,取值范围0到6,默认为0。

从数据中提取日期和时间数据时,可以使用下列函数:

  • Date(expr)函数,提取参数expr中的日期数据。expr为null时返回null。
  • Time(expr)函数,提取参数expr中的时间数据。expr为null时返回null。
  • Year(date)函数,提取参数date中的年份数据。date为null时返回null。
  • Month(date)函数,提取参数date中的月份数据。date为null时返回null。
  • Day(date)或DayOfMonth(date)函数,提取参数date中的日数据,即一个月中的第几天。date为null时返回null。
  • DayOfWeek(date)函数,返回星期几,1表示星期日、2表示星期一、……、7表示星期六。date为null时返回null。
  • DayOfYear(date)函数,返回日期是一年中的第几天,返回1到366的数值。date为null时返回null。
  • Hour(time)函数,返回参数time中的小时数据,time为null时返回null。
  • Minute(time)函数,返回参数time中的分钟数据,time为null时返回null。
  • Second(time)函数,返回参数time中的秒数据,time为null时返回null。
  • MicroSecond(expr)函数,返回参数time中的微秒数据,time为null时返回null。
  • To_Seconds(expr)函数,返回expr中的日期或时间距离0年的秒数。请注意,日期中的年、月、日没有0值,但在MySQL中可以插入'0000-00-00'格式的日期数据。如to_seconds('0-1-1')会返回86400,即一天的秒数。

此外,截取部分日期和时间信息时还可以使用extract(<类型> from <日期和时间>)函数,其中,<类型>可以指定返回信息的类型,下面是一些可以使用的组合类型:

  • day_hour
  • day_microsecond
  • day_minute
  • day_second
  • hour_microsecond
  • hour_minute
  • hour_second
  • minute_microsecond
  • minute_second
  • second_mcirosecond
  • year_month

如下面的代码只返回当前日期的年和月。

MySQL
select extract(year_month from now());

日期和时间的推算

下面来看几个关于日期和时间计算的函数。

AddDate(expr,interval n unit)函数,其中,参数expr为基础日期;参数2指定推算的单位和数值,如果只使用整数则为推算的天数,如果设置为浮点数则四合五入为整数后计算。此外,Date_Add()、SubDate()和Date_Sub()函数都与AddDate()函数功能相同。

下面两行代码都会返回系统当前日期向后推算3天的日期。

MySQL
select adddate(curdate(),3);
select adddate(curdate(),interval 3 day);

对日期向前推算时可以使用负数,如下面的代码会返回系统日期前3天的日期。

MySQL
select adddate(curdate(),-3);

推算月份时可以使用month关键字,如下面的代码。

MySQL
select adddate(curdate(),interval 3 month);

相应的,推算年份则使用year关键字,如下面的代码。

MySQL
select adddate(curdate(),interval 3 year);

此外,按周推算时使用week关键字,按季度推算时使用quarter关键字。实际上,AddDate()函数不只是推算日期,也可以按时间进行推算,如使用关键字hour、minute、second、microsecond等;这里也可以使用前面extract()函数中使用的组合关键字,如下面的代码会在系统当前时间上加上1小时10分钟。

MySQL
select adddate(now(),interval '1:10' day_minute);

AddTime(x,y)函数用于时间的推算,其中,x为日期或时间表达式,y为时间表达式,函数会返回x+y的值,如果x或y为null则函数返回null。下面的代码演示了AddTime()函数的应用。

MySQL
select addtime(now(),'2:10:30');

执行代码会返回系统当前时间加上2小时10分钟30秒的时间。

DateDiff(x,y)函数会按日期信息计算x-y的天数,如下面的代码。

MySQL
select DateDiff('2026-5-9 23:59:59','2026-5-10');

执行代码会显示-1。

TimeDiff(x,y)函数会计算x-y的时间间隔,如下面的代码。

MySQL
select TimeDiff('23:59:59','22:50:51');

执行代码会显示'01:09:08'。

日期和时间的格式化

日期和时间数据除了使用字符串格式,需要时也可以转换为数值格式,只需要对日期或时间数据进行加0计算即可完成格式的转换,如下面的代码。

MySQL
select now()+0;

执行代码会返回14位的日期加时间数值,包含4位年份,各2位的月、日、时、分、秒数据。请注意,将日期和时间转换为数值时,如果有毫秒或微秒部分,会使用小数部分表示,如“select now(3)+0;”会显示包含3位小数的数据(末尾的0不会显示)。

Date_Format(date,format)函数可以将参数date中的日期和时间数据转换为format指定的格式。参数format使用字符串指定格式,其中可以使用的格式化字符包括:

格式化字符说明
%a简写的星期名称。
%b简写的月份名称。
%c月份数值,1到12。
%d一个月中的第几天,00到31。
%D一个月中的第几天,按序数后缀。
%e一个月中的第几天,0到31。
%f微秒,000000到999999。
%h,%I12小时制中的小时,01到12。
%H24小时制中的小时,01到23。
%i分钟,00到59。
%j一年中的第几天,000到366。
%k24小时制中的小时,1到23。
%l12小时制中的小时,1到12。
%m月份,01到12。
%M完整的月份名称。
%p显示AM或PM。
%r显示12小时制的时间,如'09:03:05 PM'
%s,%S秒,00到59。
%T24小时制的时间。
%u一年中的第几周(周一为一周的第一天)。
%U一年中的第几周(周日为一周的第一天)。
%v一年中的第几周(周一为一周的第一天)。当一个星期可能跨年时,可以通过%x显示本周属于哪一年。
%V一年中的第几周(周日为一周的第一天)。当一个星期可能跨年时,可以通过%X显示本周属于哪一年。如‘select date_format('2026-01-01','%V , %X');’显示'52 , 2025'。
%w星期几。0为星期天,1到6分别表示星期一到星期六。
%W星期全名。
%y2位年份。
%Y4位年份。
%%显示%符号。

除了表中的格式字符,在格式化字符串中可以使用其它可视字符,如下面的代码会按指定的格式显示系统当前日期。

MySQL
select date_format(now(),'%Y年%m月%d日');

代码会按“yyyy年mm月dd日”的格式显示日期。

下一篇文章还将讨论如何使用、查询日期和时间数据。