在SQL开发场景中,日期处理是几乎每个项目都会涉及的需求,比如统计当日新增数据、按月份汇总业务数据、计算两个日期的时间差等,这些场景都需要依赖SQL内置的日期函数来实现。不同数据库如MySQL、PostgreSQL、SQL Server的日期函数语法存在一定差异,但核心功能逻辑基本一致,掌握通用的处理思路和常用函数就能应对大部分场景。

常用SQL日期函数介绍
获取当前日期和时间
获取当前时间是日期处理的基础操作,不同数据库的实现方式如下:
- MySQL:使用
NOW()获取当前日期和时间,CURDATE()获取当前日期,CURTIME()获取当前时间 - PostgreSQL:使用
NOW()或者CURRENT_TIMESTAMP获取当前日期和时间,CURRENT_DATE获取当前日期 - SQL Server:使用
GETDATE()获取当前日期和时间,CAST(GETDATE() AS DATE)获取当前日期
以下是MySQL中获取当前日期和时间的示例代码:
-- 获取当前完整日期时间 SELECT NOW() AS current_datetime; -- 获取当前日期 SELECT CURDATE() AS current_date; -- 获取当前时间 SELECT CURTIME() AS current_time;
日期格式化函数
当需要将日期转换为指定格式的字符串时,可以使用格式化函数,最常用的格式化占位符包括:%Y代表四位年份,%m代表两位月份,%d代表两位日期,%H代表24小时制小时,%i代表分钟,%s代表秒。
MySQL中使用DATE_FORMAT()函数进行日期格式化,示例代码如下:
-- 将当前时间格式化为 年-月-日 时:分:秒 的格式 SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s') AS formatted_time; -- 格式化为 月/日/年 格式 SELECT DATE_FORMAT(NOW(), '%m/%d/%Y') AS another_format;
日期计算实用技巧
计算日期差值
计算两个日期之间的时间差是常见需求,比如统计用户注册至今的天数,或者计算订单的配送时长。MySQL中使用DATEDIFF()计算两个日期的天数差,使用TIMESTAMPDIFF()可以计算指定单位的差值。
-- 计算两个日期的天数差,结果为30
SELECT DATEDIFF('2024-03-31', '2024-03-01') AS day_diff;
-- 计算两个时间差的小时数
SELECT TIMESTAMPDIFF(HOUR, '2024-03-01 08:00:00', '2024-03-01 12:30:00') AS hour_diff;
-- 计算用户注册天数
SELECT username, TIMESTAMPDIFF(DAY, register_time, NOW()) AS register_days FROM user_table;
日期加减操作
对日期进行加减操作可以实现获取昨天、明天、下个月同一天等需求,MySQL中使用DATE_ADD()和DATE_SUB()函数,也可以通过INTERVAL关键字直接操作。
-- 获取明天的日期 SELECT DATE_ADD(CURDATE(), INTERVAL 1 DAY) AS tomorrow; -- 获取30天前的日期 SELECT DATE_SUB(NOW(), INTERVAL 30 DAY) AS thirty_days_ago; -- 获取下个月的同一天 SELECT CURDATE() + INTERVAL 1 MONTH AS next_month_same_day;
时间戳与日期互转
很多业务场景中会存储时间戳(秒级或毫秒级),需要转换为可读日期,或者将日期转换为时间戳存储。MySQL中FROM_UNIXTIME()可以将时间戳转换为日期,UNIX_TIMESTAMP()可以将日期转换为时间戳。
-- 将秒级时间戳转换为日期
SELECT FROM_UNIXTIME(1710326400) AS datetime_from_timestamp;
-- 将日期转换为秒级时间戳
SELECT UNIX_TIMESTAMP('2024-03-13 08:00:00') AS timestamp_value;
-- 处理毫秒级时间戳,需要先除以1000
SELECT FROM_UNIXTIME(1710326400000 / 1000) AS datetime_from_ms_timestamp;
不同数据库日期函数差异对比
不同数据库的日期函数语法存在差异,以下是常用函数的对比表格:
| 功能 | MySQL | PostgreSQL | SQL Server |
|---|---|---|---|
| 获取当前日期时间 | NOW() | NOW() / CURRENT_TIMESTAMP | GETDATE() |
| 日期格式化 | DATE_FORMAT(date, format) | TO_CHAR(date, format) | FORMAT(date, format) |
| 计算日期差值(天) | DATEDIFF(date1, date2) | DATE_PART('day', date1 - date2) | DATEDIFF(day, date2, date1) |
| 日期加操作 | DATE_ADD(date, INTERVAL num unit) | date + INTERVAL 'num unit' | DATEADD(unit, num, date) |
注意事项
在使用SQL日期函数时需要注意几个问题:第一,不同数据库的日期函数参数顺序可能不同,比如SQL Server的DATEDIFF函数参数顺序是单位、开始日期、结束日期,而MySQL是结束日期、开始日期,使用时需要核对对应数据库的官方文档。第二,处理时间戳时要注意是秒级还是毫秒级,毫秒级时间戳需要先除以1000再转换,否则会得到错误的时间。第三,进行日期计算时要考虑闰年、月份天数不同的情况,内置函数已经处理了这些边界问题,不需要额外判断。
SQL日期函数DATE_FORMATNOW时间戳转换修改时间:2026-06-21 14:39:28