在MySQL的日常开发和数据处理中,时间的获取与格式转换是非常高频的操作,无论是记录数据创建时间、统计时间范围内的数据,还是对接不同系统的时间格式要求,都需要用到相关的时间处理函数。掌握这些函数的用法,能让时间相关的开发工作更加高效。

一、MySQL获取时间的常用方法
1. 获取当前完整时间
最常用的获取当前时间的函数是NOW(),它会返回当前的日期和时间,格式为YYYY-MM-DD HH:MM:SS,返回值的类型取决于使用的上下文,在字符串上下文返回字符串,在日期上下文返回DATETIME类型。
-- 获取当前完整时间 SELECT NOW(); -- 示例返回结果:2024-05-20 14:30:25
另一个类似的函数是CURRENT_TIMESTAMP(),它的功能和NOW()完全一致,可以互相替换使用。
SELECT CURRENT_TIMESTAMP(); -- 返回结果和NOW()一致
2. 获取当前日期或当前时间
如果只需要获取当前的日期部分,可以使用CURDATE()或者CURRENT_DATE(),返回格式为YYYY-MM-DD。
-- 获取当前日期 SELECT CURDATE(); -- 示例返回结果:2024-05-20 SELECT CURRENT_DATE(); -- 返回结果和CURDATE()一致
如果只需要获取当前的时间部分,可以使用CURTIME()或者CURRENT_TIME(),返回格式为HH:MM:SS。
-- 获取当前时间 SELECT CURTIME(); -- 示例返回结果:14:30:25 SELECT CURRENT_TIME(); -- 返回结果和CURTIME()一致
3. 获取Unix时间戳
Unix时间戳是从1970年1月1日00:00:00 UTC到当前时间的总秒数,MySQL中可以使用UNIX_TIMESTAMP()函数获取当前时间的Unix时间戳,如果不传参数则返回当前时间的时间戳,传入日期参数则返回对应日期的时间戳。
-- 获取当前Unix时间戳
SELECT UNIX_TIMESTAMP();
-- 示例返回结果:1716189025
-- 获取指定日期的Unix时间戳
SELECT UNIX_TIMESTAMP('2024-05-20 14:30:25');
-- 返回结果:1716189025
二、MySQL时间格式转换方法
1. 使用DATE_FORMAT函数格式化日期
DATE_FORMAT(date, format)是MySQL中最常用的时间格式化函数,第一个参数是要格式化的日期值,第二个参数是格式字符串,通过不同的格式符可以输出任意需要的时间格式。
常用的格式符说明如下:
| 格式符 | 说明 | 示例 |
|---|---|---|
| %Y | 四位年份 | 2024 |
| %y | 两位年份 | 24 |
| %m | 两位月份(01-12) | 05 |
| %c | 月份(1-12) | 5 |
| %d | 两位日期(01-31) | 20 |
| %H | 24小时制小时(00-23) | 14 |
| %h | 12小时制小时(01-12) | 02 |
| %i | 分钟(00-59) | 30 |
| %s | 秒(00-59) | 25 |
| %W | 星期全称 | Monday |
| %w | 星期索引(0=周日,6=周六) | 1 |
下面是一些常用的格式化示例:
-- 格式化为YYYY年MM月DD日 HH时MM分SS秒 SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H时%i分%s秒'); -- 示例返回结果:2024年05月20日 14时30分25秒 -- 格式化为MM/DD/YYYY SELECT DATE_FORMAT(NOW(), '%m/%d/%Y'); -- 示例返回结果:05/20/2024 -- 只获取年份和月份 SELECT DATE_FORMAT(NOW(), '%Y-%m'); -- 示例返回结果:2024-05
2. Unix时间戳和日期的相互转换
前面提到UNIX_TIMESTAMP()可以将日期转换为Unix时间戳,反过来可以使用FROM_UNIXTIME(unix_timestamp, format)函数将Unix时间戳转换为日期,第二个参数可选,用于指定输出格式,不指定的话默认返回YYYY-MM-DD HH:MM:SS格式。
-- 将Unix时间戳转换为默认格式的日期 SELECT FROM_UNIXTIME(1716189025); -- 示例返回结果:2024-05-20 14:30:25 -- 将Unix时间戳转换为指定格式的日期 SELECT FROM_UNIXTIME(1716189025, '%Y年%m月%d日'); -- 示例返回结果:2024年05月20日
3. 字符串和时间类型的相互转换
如果拿到的是字符串格式的时间,需要转换为MySQL的日期类型,可以使用STR_TO_DATE(str, format)函数,格式符和DATE_FORMAT中的一致。
-- 将字符串转换为日期类型
SELECT STR_TO_DATE('2024年05月20日', '%Y年%m月%d日');
-- 示例返回结果:2024-05-20
-- 将字符串转换为日期时间类型
SELECT STR_TO_DATE('2024-05-20 14:30:25', '%Y-%m-%d %H:%i:%s');
-- 示例返回结果:2024-05-20 14:30:25
如果要将日期类型转换为字符串,除了用DATE_FORMAT,也可以直接使用CAST函数做类型转换,不过CAST转换的格式是固定的,灵活性不如DATE_FORMAT。
-- 使用CAST将日期转换为字符串 SELECT CAST(NOW() AS CHAR); -- 示例返回结果:2024-05-20 14:30:25
三、实际开发中的常见场景示例
1. 查询当天的数据
很多业务场景需要查询当天新增的数据,通常表中会有create_time这样的DATETIME类型字段,我们可以通过格式转换来实现查询。
-- 查询当天创建的数据 SELECT * FROM order_table WHERE DATE_FORMAT(create_time, '%Y-%m-%d') = CURDATE();
2. 统计近7天的数据量
统计近7天的数据量时,可以通过日期计算来获取起始时间。
-- 统计近7天每天的数据量
SELECT
DATE_FORMAT(create_time, '%Y-%m-%d') AS day,
COUNT(*) AS count
FROM order_table
WHERE create_time >= DATE_SUB(CURDATE(), INTERVAL 6 DAY)
GROUP BY day;
3. 时间字段的默认值设置
在建表的时候,如果需要记录数据的创建时间和更新时间,可以设置默认值自动获取当前时间。
-- 创建测试表
CREATE TABLE test_time (
id INT PRIMARY KEY AUTO_INCREMENT,
content VARCHAR(255),
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 插入数据时不指定时间字段,会自动填充当前时间
INSERT INTO test_time (content) VALUES ('测试内容');
SELECT * FROM test_time;
-- 可以看到create_time和update_time都自动填充了当前时间
四、注意事项
- 时间函数的返回值类型需要注意,比如
NOW()在作为字符串比较和作为日期比较时可能有不同的表现,建议做时间范围查询时尽量使用日期类型的比较,避免字符串转换带来的性能问题。 - 使用
STR_TO_DATE转换字符串时,格式符必须和字符串的格式完全匹配,否则会返回NULL。 - Unix时间戳的范围是1970-01-01 00:00:00到2038-01-19 03:14:07,超出这个范围的时间无法用32位Unix时间戳表示,需要注意业务中的时间范围是否合理。
- 不同的MySQL版本对时间函数的支持可能有细微差异,使用前建议确认当前使用的版本对应的函数文档。
MySQL时间获取时间格式转换DATE_FORMATUNIX_TIMESTAMP修改时间:2026-06-13 14:06:22