Mysql时间函数
一、MySQL 时间格式化方法
1. DATE_FORMAT()
函数
作用:将日期/时间值格式化为字符串。
常用格式符:
%Y
:4位年份(如 2023)%y
:2位年份(如 23)%m
:两位月份(01~12)%d
:两位日期(01~31)%H
:24小时制小时(00~23)%i
:分钟(00~59)%s
:秒(00~59)%W
:星期名称(如 Monday)%a
:缩写星期(如 Mon)
示例:
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS formatted_datetime,DATE_FORMAT('2023-10-05 14:30:00', '%W, %M %Y') AS readable_date;
输出:
formatted_datetime | readable_date
-----------------------|------------------
2023-10-05 14:30:00 | Thursday, October 2023
2. STR_TO_DATE()
函数
作用:将字符串转换为日期/时间类型。
示例:
SELECT STR_TO_DATE('05-10-2023', '%d-%m-%Y') AS date_from_string;
输出:
date_from_string
----------------
2023-10-05
3. UNIX_TIMESTAMP()
与 FROM_UNIXTIME()
UNIX_TIMESTAMP()
:将日期转为 Unix 时间戳(秒级)。FROM_UNIXTIME()
:将 Unix 时间戳转为日期。
SELECT UNIX_TIMESTAMP('2023-10-05 00:00:00') AS timestamp,FROM_UNIXTIME(1696464000) AS formatted_date;
输出:
timestamp | formatted_date
-------------|-------------------
1696464000 | 2023-10-05 00:00:00
二、MySQL 时间比较方法
1. 直接比较日期时间
-- 查询 2023 年 10 月之后的订单
SELECT * FROM orders
WHERE order_time >= '2023-10-01 00:00:00';
2. DATEDIFF()
计算日期差
作用:返回两个日期相差的天数。
SELECT DATEDIFF('2023-10-10', '2023-10-05') AS day_diff;
输出:
day_diff
--------
5
3. TIMESTAMPDIFF()
计算差值
作用:按单位(秒、分钟、小时、天等)计算时间差。
单位参数:SECOND
, MINUTE
, HOUR
, DAY
, MONTH
, YEAR
。
SELECT TIMESTAMPDIFF(HOUR, '2023-10-05 08:00:00', '2023-10-05 20:30:00') AS hour_diff,TIMESTAMPDIFF(MONTH, '2023-01-01', '2023-10-01') AS month_diff;
输出:
hour_diff | month_diff
----------|-----------
12 | 9
4. DATE_ADD()
和 DATE_SUB()
作用:对日期进行加减操作。
-- 查询 7 天前的日期
SELECT DATE_SUB(CURDATE(), INTERVAL 7 DAY) AS last_week;-- 查询 3 小时后的时间
SELECT DATE_ADD(NOW(), INTERVAL 3 HOUR) AS future_time;
5. 使用 BETWEEN
筛选时间范围
-- 查询 2023 年 10 月的订单
SELECT * FROM orders
WHERE order_time BETWEEN '2023-10-01' AND '2023-10-31 23:59:59';
三、综合应用案例
案例1:统计最近7天每天的订单量
SELECT DATE_FORMAT(order_time, '%Y-%m-%d') AS order_date,COUNT(*) AS order_count
FROM orders
WHERE order_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY)
GROUP BY order_date
ORDER BY order_date;
案例2:计算用户注册后的活跃天数
SELECT user_id,DATEDIFF(MAX(last_login), MIN(register_time)) AS active_days
FROM user_activity
GROUP BY user_id;
四、注意事项
- 时区问题:确保数据库时区与业务逻辑一致,可用
SET time_zone = '+8:00';
调整。 - 索引优化:避免对字段使用函数(如
WHERE DATE(order_time) = ...
),可能导致索引失效。 - 精度处理:时间比较时注意微秒精度(
DATETIME(6)
)的影响。
通过上述方法,可高效处理 MySQL 中的时间格式化和比较需求。