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;

四、注意事项

  1. 时区问题:确保数据库时区与业务逻辑一致,可用 SET time_zone = '+8:00'; 调整。
  2. 索引优化:避免对字段使用函数(如 WHERE DATE(order_time) = ...),可能导致索引失效。
  3. 精度处理:时间比较时注意微秒精度(DATETIME(6))的影响。

通过上述方法,可高效处理 MySQL 中的时间格式化和比较需求。

你可能感兴趣的:(MySql,mysql,数据库)