Appearance
SQL 日期函数
SQL 日期函数用于处理日期和时间类型的数据。不同的数据库系统提供了不同的日期函数,但有一些函数是通用的。
常用日期函数
1. 获取当前日期和时间
| 函数名 | 描述 | 示例 | 结果 |
|---|---|---|---|
| CURRENT_DATE | 获取当前日期 | SELECT CURRENT_DATE; | 2023-10-01 |
| CURRENT_TIME | 获取当前时间 | SELECT CURRENT_TIME; | 14:30:45 |
| CURRENT_TIMESTAMP | 获取当前日期和时间 | SELECT CURRENT_TIMESTAMP; | 2023-10-01 14:30:45 |
| NOW() | 获取当前日期和时间(MySQL) | SELECT NOW(); | 2023-10-01 14:30:45 |
| GETDATE() | 获取当前日期和时间(SQL Server) | SELECT GETDATE(); | 2023-10-01 14:30:45 |
2. 日期部分提取
| 函数名 | 描述 | 示例 | 结果 |
|---|---|---|---|
| YEAR() | 提取年份 | SELECT YEAR('2023-10-01'); | 2023 |
| MONTH() | 提取月份 | SELECT MONTH('2023-10-01'); | 10 |
| DAY() | 提取日 | SELECT DAY('2023-10-01'); | 1 |
| HOUR() | 提取小时 | SELECT HOUR('14:30:45'); | 14 |
| MINUTE() | 提取分钟 | SELECT MINUTE('14:30:45'); | 30 |
| SECOND() | 提取秒 | SELECT SECOND('14:30:45'); | 45 |
| DATEPART() | 提取日期部分(SQL Server) | SELECT DATEPART(YEAR, '2023-10-01'); | 2023 |
3. 日期计算
| 函数名 | 描述 | 示例 | 结果 |
|---|---|---|---|
| DATE_ADD() | 添加日期/时间间隔(MySQL) | SELECT DATE_ADD('2023-10-01', INTERVAL 1 DAY); | 2023-10-02 |
| DATE_SUB() | 减去日期/时间间隔(MySQL) | SELECT DATE_SUB('2023-10-01', INTERVAL 1 DAY); | 2023-09-30 |
| ADDDATE() | 添加日期(MySQL) | SELECT ADDDATE('2023-10-01', 1); | 2023-10-02 |
| SUBDATE() | 减去日期(MySQL) | SELECT SUBDATE('2023-10-01', 1); | 2023-09-30 |
| DATEADD() | 添加日期/时间间隔(SQL Server) | SELECT DATEADD(DAY, 1, '2023-10-01'); | 2023-10-02 |
| DATEDIFF() | 计算两个日期之间的差值 | SELECT DATEDIFF('2023-10-05', '2023-10-01'); | 4 |
4. 日期格式化
| 函数名 | 描述 | 示例 | 结果 |
|---|---|---|---|
| DATE_FORMAT() | 格式化日期(MySQL) | SELECT DATE_FORMAT('2023-10-01', '%Y-%m-%d'); | 2023-10-01 |
| FORMAT() | 格式化日期(SQL Server) | SELECT FORMAT('2023-10-01', 'yyyy-MM-dd'); | 2023-10-01 |
| TO_CHAR() | 格式化日期(Oracle、PostgreSQL) | SELECT TO_CHAR('2023-10-01', 'YYYY-MM-DD'); | 2023-10-01 |
示例
示例 1:获取当前日期和时间
sql
-- MySQL
SELECT CURRENT_DATE AS current_date,
CURRENT_TIME AS current_time,
CURRENT_TIMESTAMP AS current_timestamp,
NOW() AS now;
-- SQL Server
SELECT CURRENT_TIMESTAMP AS current_timestamp,
GETDATE() AS getdate;
-- PostgreSQL
SELECT CURRENT_DATE AS current_date,
CURRENT_TIME AS current_time,
CURRENT_TIMESTAMP AS current_timestamp;
-- Oracle
SELECT SYSDATE AS sysdate,
CURRENT_TIMESTAMP AS current_timestamp
FROM DUAL;示例 2:提取日期部分
sql
-- 提取日期部分
SELECT
YEAR('2023-10-01') AS year,
MONTH('2023-10-01') AS month,
DAY('2023-10-01') AS day;
-- 提取时间部分
SELECT
HOUR('14:30:45') AS hour,
MINUTE('14:30:45') AS minute,
SECOND('14:30:45') AS second;
-- 提取日期时间的各个部分
SELECT
YEAR('2023-10-01 14:30:45') AS year,
MONTH('2023-10-01 14:30:45') AS month,
DAY('2023-10-01 14:30:45') AS day,
HOUR('2023-10-01 14:30:45') AS hour,
MINUTE('2023-10-01 14:30:45') AS minute,
SECOND('2023-10-01 14:30:45') AS second;示例 3:日期计算
sql
-- MySQL:添加日期
SELECT
DATE_ADD('2023-10-01', INTERVAL 1 DAY) AS add_day,
DATE_ADD('2023-10-01', INTERVAL 1 MONTH) AS add_month,
DATE_ADD('2023-10-01', INTERVAL 1 YEAR) AS add_year,
DATE_ADD('2023-10-01 14:30:45', INTERVAL 1 HOUR) AS add_hour;
-- MySQL:减去日期
SELECT
DATE_SUB('2023-10-01', INTERVAL 1 DAY) AS sub_day,
DATE_SUB('2023-10-01', INTERVAL 1 MONTH) AS sub_month,
DATE_SUB('2023-10-01', INTERVAL 1 YEAR) AS sub_year;
-- 计算两个日期之间的天数
SELECT DATEDIFF('2023-10-05', '2023-10-01') AS days_diff;
-- SQL Server:日期计算
SELECT
DATEADD(DAY, 1, '2023-10-01') AS add_day,
DATEADD(MONTH, 1, '2023-10-01') AS add_month,
DATEDIFF(DAY, '2023-10-01', '2023-10-05') AS days_diff;示例 4:日期格式化
sql
-- MySQL:日期格式化
SELECT
DATE_FORMAT('2023-10-01', '%Y-%m-%d') AS format1,
DATE_FORMAT('2023-10-01', '%d/%m/%Y') AS format2,
DATE_FORMAT('2023-10-01 14:30:45', '%Y-%m-%d %H:%i:%s') AS format3,
DATE_FORMAT('2023-10-01', '%W, %M %d, %Y') AS format4;
-- SQL Server:日期格式化
SELECT
FORMAT('2023-10-01', 'yyyy-MM-dd') AS format1,
FORMAT('2023-10-01', 'dd/MM/yyyy') AS format2,
FORMAT('2023-10-01 14:30:45', 'yyyy-MM-dd HH:mm:ss') AS format3;
-- PostgreSQL:日期格式化
SELECT
TO_CHAR('2023-10-01'::DATE, 'YYYY-MM-DD') AS format1,
TO_CHAR('2023-10-01'::DATE, 'DD/MM/YYYY') AS format2,
TO_CHAR('2023-10-01 14:30:45'::TIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') AS format3;
-- Oracle:日期格式化
SELECT
TO_CHAR(SYSDATE, 'YYYY-MM-DD') AS format1,
TO_CHAR(SYSDATE, 'DD/MM/YYYY') AS format2,
TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS format3
FROM DUAL;示例 5:实际应用
假设我们有一个 orders 表,包含订单的创建时间:
| order_id | customer_id | order_date | total_amount |
|---|---|---|---|
| 1 | 1001 | 2023-09-15 10:30:00 | 100.00 |
| 2 | 1002 | 2023-09-20 14:45:00 | 200.00 |
| 3 | 1003 | 2023-10-01 09:15:00 | 150.00 |
| 4 | 1001 | 2023-10-05 11:20:00 | 300.00 |
| 5 | 1002 | 2023-10-10 16:50:00 | 250.00 |
sql
-- 查询 2023 年 10 月的订单
SELECT * FROM orders
WHERE YEAR(order_date) = 2023 AND MONTH(order_date) = 10;
-- 查询最近 7 天的订单(MySQL)
SELECT * FROM orders
WHERE order_date >= DATE_SUB(NOW(), INTERVAL 7 DAY);
-- 查询每个月的订单总金额(MySQL)
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS month,
SUM(total_amount) AS total_amount
FROM orders
GROUP BY DATE_FORMAT(order_date, '%Y-%m')
ORDER BY month;
-- 查询每个客户的最近订单
SELECT
o1.*
FROM orders o1
JOIN (
SELECT
customer_id,
MAX(order_date) AS max_order_date
FROM orders
GROUP BY customer_id
) o2 ON o1.customer_id = o2.customer_id AND o1.order_date = o2.max_order_date;注意事项
时区问题:不同的数据库系统和服务器可能使用不同的时区设置,这会影响日期和时间函数的结果。
日期格式:不同的数据库系统支持不同的日期格式,在使用日期函数时需要注意。
性能影响:在 WHERE 子句中使用日期函数可能会影响查询性能,因为函数会对每一行数据进行计算。
NULL 值处理:如果日期字段为 NULL,日期函数可能会返回 NULL 或产生错误,需要进行适当的处理。
闰年和月份天数:在进行日期计算时,需要注意闰年和不同月份的天数差异,数据库系统会自动处理这些问题。
小结
SQL 日期函数是处理日期和时间数据的重要工具,它们可以帮助我们获取当前日期和时间、提取日期部分、进行日期计算和格式化日期。不同的数据库系统提供了不同的日期函数,但基本功能是相似的。在使用日期函数时,需要注意时区、日期格式、性能影响和 NULL 值处理等问题。