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时间进行存储和计算,并在显示时转换为用户本地时区。