MySQL日期和时间函数

日期和时间函数是MySQL中用于处理日期和时间类型数据的重要工具。这些函数可以帮助我们获取当前日期和时间、格式化日期和时间、计算日期和时间差等。MySQL提供了丰富的日期和时间函数,本章将详细介绍这些函数的用法。

获取当前日期和时间的函数

MySQL提供了多个函数用于获取当前日期和时间:

函数 描述 示例
NOW() 返回当前日期和时间 NOW() = '2023-10-15 14:30:25'
CURRENT_TIMESTAMP() NOW()的同义词 CURRENT_TIMESTAMP() = '2023-10-15 14:30:25'
CURDATE() 返回当前日期 CURDATE() = '2023-10-15'
CURRENT_DATE() CURDATE()的同义词 CURRENT_DATE() = '2023-10-15'
CURTIME() 返回当前时间 CURTIME() = '14:30:25'
CURRENT_TIME() CURTIME()的同义词 CURRENT_TIME() = '14:30:25'

UNIX时间戳函数

UNIX时间戳是从1970年1月1日开始的秒数:

函数 描述 示例
UNIX_TIMESTAMP() 返回当前UNIX时间戳 UNIX_TIMESTAMP() = 1697356225
UNIX_TIMESTAMP(date) 将日期转换为UNIX时间戳 UNIX_TIMESTAMP('2023-10-15 14:30:25') = 1697356225
FROM_UNIXTIME(unix_timestamp) 将UNIX时间戳转换为日期时间 FROM_UNIXTIME(1697356225) = '2023-10-15 14:30:25'
FROM_UNIXTIME(unix_timestamp, format) 将UNIX时间戳按指定格式转换为日期时间 FROM_UNIXTIME(1697356225, '%Y-%m-%d') = '2023-10-15'

UTC日期和时间函数

UTC是协调世界时(Coordinated Universal Time)的缩写:

函数 描述 示例
UTC_DATE() 返回当前UTC日期 UTC_DATE() = '2023-10-15'
UTC_TIME() 返回当前UTC时间 UTC_TIME() = '06:30:25'(假设本地时间为UTC+8)
UTC_TIMESTAMP() 返回当前UTC日期和时间 UTC_TIMESTAMP() = '2023-10-15 06:30:25'(假设本地时间为UTC+8)

获取日期部分的函数

用于从日期时间值中提取特定部分的函数:

函数 描述 示例
YEAR(date) 返回日期的年份部分 YEAR('2023-10-15') = 2023
MONTH(date) 返回日期的月份部分(1-12) MONTH('2023-10-15') = 10
MONTHNAME(date) 返回日期的月份名称 MONTHNAME('2023-10-15') = 'October'
DAY(date) 返回日期的日部分(1-31) DAY('2023-10-15') = 15
DAYNAME(d) 返回日期对应的星期名称 DAYNAME('2023-10-15') = 'Sunday'
DAYOFWEEK(d) 返回日期对应的星期几(1-7,1=星期日) DAYOFWEEK('2023-10-15') = 1
WEEKDAY(d) 返回日期对应的星期几(0-6,0=星期一) WEEKDAY('2023-10-15') = 6
WEEK(d) 返回日期所在的年份中的星期数 WEEK('2023-10-15') = 41
WEEKOFYEAR(d) 返回日期所在的年份中的星期数(1-53) WEEKOFYEAR('2023-10-15') = 41
DAYOFYEAR(d) 返回日期在年份中的天数(1-366) DAYOFYEAR('2023-10-15') = 288
DAYOFMONTH(d) 返回日期在月份中的天数(1-31) DAYOFMONTH('2023-10-15') = 15
QUARTER(date) 返回日期所在的季度(1-4) QUARTER('2023-10-15') = 4
HOUR(time) 返回时间的小时部分(0-23) HOUR('14:30:25') = 14
MINUTE(time) 返回时间的分钟部分(0-59) MINUTE('14:30:25') = 30
SECOND(time) 返回时间的秒钟部分(0-59) SECOND('14:30:25') = 25

EXTRACT函数

EXTRACT函数用于从日期时间值中提取指定部分:

函数 描述 示例
EXTRACT(type FROM date) 从日期中提取指定类型的值 EXTRACT(YEAR FROM '2023-10-15') = 2023,EXTRACT(MONTH FROM '2023-10-15') = 10

type参数可以是:YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, YEAR_MONTH, DAY_HOUR, DAY_MINUTE, DAY_SECOND, HOUR_MINUTE, HOUR_SECOND, MINUTE_SECOND

时间和秒钟转换函数

用于时间和秒钟之间转换的函数:

函数 描述 示例
TIME_TO_SEC(time) 将时间转换为秒 TIME_TO_SEC('01:00:00') = 3600
SEC_TO_TIME(seconds) 将秒转换为时间 SEC_TO_TIME(3600) = '01:00:00'

计算日期和时间的函数

用于计算日期和时间的函数:

函数 描述 示例
DATE_ADD(date, INTERVAL expr unit) 向日期添加指定的时间间隔 DATE_ADD('2023-10-15', INTERVAL 1 DAY) = '2023-10-16'
DATE_SUB(date, INTERVAL expr unit) 从日期减去指定的时间间隔 DATE_SUB('2023-10-15', INTERVAL 1 MONTH) = '2023-09-15'
ADDDATE(date, INTERVAL expr unit) DATE_ADD的同义词 ADDDATE('2023-10-15', INTERVAL 1 WEEK) = '2023-10-22'
SUBDATE(date, INTERVAL expr unit) DATE_SUB的同义词 SUBDATE('2023-10-15', INTERVAL 7 DAY) = '2023-10-08'
ADDTIME(time, expr) 向时间添加指定的时间 ADDTIME('14:30:25', '01:15:30') = '15:45:55'
SUBTIME(time, expr) 从时间减去指定的时间 SUBTIME('14:30:25', '01:15:30') = '13:14:55'
DATEDIFF(date1, date2) 计算两个日期之间的天数差 DATEDIFF('2023-10-15', '2023-10-01') = 14
TIMEDIFF(time1, time2) 计算两个时间之间的差 TIMEDIFF('14:30:25', '10:15:10') = '04:15:15'
DATE_FORMAT(date, format) 按指定格式格式化日期 DATE_FORMAT('2023-10-15', '%Y年%m月%d日') = '2023年10月15日'
STR_TO_DATE(str, format) 将字符串按指定格式转换为日期 STR_TO_DATE('2023年10月15日', '%Y年%m月%d日') = '2023-10-15'

日期格式化参数

DATE_FORMAT和STR_TO_DATE函数中的常用格式化参数:

参数 描述 示例
%Y 四位数字的年份 2023
%y 两位数字的年份 23
%m 两位数字的月份(01-12) 10
%c 数字的月份(1-12) 10
%d 两位数字的日(01-31) 15
%e 数字的日(1-31) 15
%H 24小时制的小时(00-23) 14
%h 12小时制的小时(01-12) 02
%i 两位数字的分钟(00-59) 30
%s 两位数字的秒钟(00-59) 25
%p AM或PM PM
%W 星期的完整名称 Sunday
%a 星期的缩写名称 Sun
%M 月份的完整名称 October
%b 月份的缩写名称 Oct

示例:使用日期和时间函数

下面是一些使用日期和时间函数的实际示例:

-- 获取当前日期和时间
SELECT NOW() AS current_datetime, CURDATE() AS current_date, CURTIME() AS current_time;

-- 格式化日期
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS formatted_datetime;
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H时%i分%s秒') AS chinese_format;

-- 计算日期差
SELECT DATEDIFF('2023-12-31', '2023-10-15') AS days_until_new_year;

-- 添加和减去日期时间
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY) AS next_week;
SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH) AS last_month;
SELECT ADDTIME(NOW(), '01:30:00') AS one_and_half_hour_later;

-- 提取日期部分
SELECT YEAR(NOW()) AS year, MONTH(NOW()) AS month, DAY(NOW()) AS day;
SELECT HOUR(NOW()) AS hour, MINUTE(NOW()) AS minute, SECOND(NOW()) AS second;

-- 使用EXTRACT函数
SELECT EXTRACT(YEAR FROM NOW()) AS year, EXTRACT(QUARTER FROM NOW()) AS quarter;

-- UNIX时间戳转换
SELECT UNIX_TIMESTAMP(NOW()) AS current_timestamp;
SELECT FROM_UNIXTIME(1697356225) AS datetime_from_timestamp;

-- 字符串转换为日期
SELECT STR_TO_DATE('2023-10-15', '%Y-%m-%d') AS date_from_string;
SELECT STR_TO_DATE('2023年10月15日', '%Y年%m月%d日') AS chinese_date_from_string;

提示:在MySQL中处理日期和时间时,需要注意时区的问题。MySQL服务器有自己的时区设置,可能与应用程序或客户端的时区不同。在处理跨时区的应用时,建议使用UTC时间进行存储和计算,并在显示时转换为用户本地时区。