以下是SQL中常用时间操作函数的汇总,按功能分类整理,结合多个权威来源内容综合而成:
一、获取当前时间
函数名称 | 功能说明 | 示例 | 适用数据库 |
---|---|---|---|
CURDATE() | 获取当前日期(不含时间) | SELECT CURDATE(); → 2024-08-21 | MySQL, MariaDB |
CURRENT_DATE() | 同CURDATE() (标准SQL) | SELECT CURRENT_DATE; | 多数数据库 |
NOW() | 获取当前日期和时间 | SELECT NOW(); → 2024-08-21 10:41:41 | MySQL, SQL Server |
GETDATE() | 获取当前日期时间(SQL Server专用) | SELECT GETDATE(); | SQL Server |
CURRENT_TIMESTAMP | 获取当前时间戳(带时区) | SELECT CURRENT_TIMESTAMP; | PostgreSQL, Oracle |
二、提取时间部分
函数名称 | 功能说明 | 示例 | 适用数据库 |
---|---|---|---|
YEAR(date) | 提取年份 | YEAR('2024-08-21') → 2024 | MySQL, SQL Server |
MONTH(date) | 提取月份(1-12) | MONTH('2024-08-21') → 8 | 通用 |
DAY(date) | 提取日(1-31) | DAY('2024-08-21') → 21 | 通用 |
HOUR(time) | 提取小时(0-23) | HOUR('10:41:41') → 10 | MySQL, SQL Server |
MINUTE(time) | 提取分钟(0-59) | MINUTE('10:41:41') → 41 | 通用 |
SECOND(time) | 提取秒(0-59) | SECOND('10:41:41') → 41 | 通用 |
EXTRACT(unit FROM date) | 灵活提取指定部分(年/月/日等) | EXTRACT(YEAR FROM '2024-08-21') → 2024 | PostgreSQL, MySQL |
三、时间计算与操作
函数名称 | 功能说明 | 示例 | 适用数据库 |
---|---|---|---|
DATE_ADD(date, INTERVAL expr unit) | 日期增加指定时间间隔 | DATE_ADD('2024-08-21', INTERVAL 7 DAY) → 2024-08-28 | MySQL |
DATE_SUB(date, INTERVAL expr unit) | 日期减去指定时间间隔 | DATE_SUB('2024-08-21', INTERVAL 1 MONTH) → 2024-07-21 | MySQL |
DATEDIFF(date1, date2) | 计算两个日期相差的天数 | DATEDIFF('2024-08-21', '2024-08-01') → 20 | MySQL, SQL Server |
TIMESTAMPDIFF(unit, start, end) | 按单位计算时间差(天/小时等) | TIMESTAMPDIFF(DAY, '2024-08-01', '2024-08-21') → 20 | MySQL |
ADDDATE(date, days) | 日期增加指定天数 | ADDDATE('2024-08-21', 7) → 2024-08-28 | MySQL |
四、时间格式化与转换
函数名称 | 功能说明 | 示例 | 适用数据库 |
---|---|---|---|
DATE_FORMAT(date, format) | 按指定格式输出日期 | DATE_FORMAT('2024-08-21', '%Y年%m月%d日') → 2024年08月21日 | MySQL |
TO_CHAR(date, format) | 日期转字符串(PostgreSQL/Oracle) | TO_CHAR('2024-08-21', 'YYYY-MM-DD') → 2024-08-21 | PostgreSQL, Oracle |
STR_TO_DATE(str, format) | 字符串转日期 | STR_TO_DATE('2024年08月21日', '%Y年%m月%d日') → 2024-08-21 | MySQL |
UNIX_TIMESTAMP(date) | 日期转Unix时间戳 | UNIX_TIMESTAMP('2024-08-21') → 1724208000 | MySQL |
FROM_UNIXTIME(unixtime) | Unix时间戳转日期 | FROM_UNIXTIME(1724208000) → 2024-08-21 00:00:00 | MySQL |
五、实用场景函数
- 查询今天数据
SELECT * FROM orders WHERE DATE(created_at) = CURDATE();
- 查询昨天数据
SELECT * FROM orders WHERE DATE(created_at) = DATE_SUB(CURDATE(), INTERVAL 1 DAY);
- 查询未来7天数据
SELECT * FROM events WHERE event_date BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY);
- 计算工龄(年)
SELECT TIMESTAMPDIFF(YEAR, hire_date, CURDATE()) AS years_of_service FROM employees;
关键注意事项
- 数据库差异
- SQL Server使用
GETDATE()
而非NOW()
,日期加减用DATEADD()
/DATEDIFF()
。 - Oracle使用
SYSDATE
获取当前时间,TO_DATE()
转换字符串。
- SQL Server使用
- 时区处理
CURRENT_TIMESTAMP
返回带时区的时间,需结合CONVERT_TZ()
转换时区(MySQL)。
- 性能优化
- 避免在
WHERE
条件中对列使用函数(如YEAR(date)=2024
),可能导致索引失效。
- 避免在
完整函数列表及语法细节可参考:MySQL日期函数文档、SQL Server时间函数。
以上内容由AI生成,仅供参考和借鉴