Skip to content

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_idcustomer_idorder_datetotal_amount
110012023-09-15 10:30:00100.00
210022023-09-20 14:45:00200.00
310032023-10-01 09:15:00150.00
410012023-10-05 11:20:00300.00
510022023-10-10 16:50:00250.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;

注意事项

  1. 时区问题:不同的数据库系统和服务器可能使用不同的时区设置,这会影响日期和时间函数的结果。

  2. 日期格式:不同的数据库系统支持不同的日期格式,在使用日期函数时需要注意。

  3. 性能影响:在 WHERE 子句中使用日期函数可能会影响查询性能,因为函数会对每一行数据进行计算。

  4. NULL 值处理:如果日期字段为 NULL,日期函数可能会返回 NULL 或产生错误,需要进行适当的处理。

  5. 闰年和月份天数:在进行日期计算时,需要注意闰年和不同月份的天数差异,数据库系统会自动处理这些问题。

小结

SQL 日期函数是处理日期和时间数据的重要工具,它们可以帮助我们获取当前日期和时间、提取日期部分、进行日期计算和格式化日期。不同的数据库系统提供了不同的日期函数,但基本功能是相似的。在使用日期函数时,需要注意时区、日期格式、性能影响和 NULL 值处理等问题。