五種主流數(shù)據(jù)庫:常用日期函數(shù)
日期函數(shù)用于操作日期和時間數(shù)據(jù),例如獲取當前日期、計算兩個日期之間的間隔以及獲取日期的部分信息等。
本文比較五種主流數(shù)據(jù)庫常用日期函數(shù)的實現(xiàn)和差異,包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。
日期函數(shù) | 函數(shù)功能 | MySQL | Oracle | SQL Server | PostgreSQL | SQLite |
CURRENT_DATE | 返回系統(tǒng)當前日期 | ?? | ?? | GETDATE() | ?? | ?? |
CURRENT_TIME | 返回系統(tǒng)當前時間 | ?? | ? | GETDATE() | ?? | ?? |
CURRENT_TIMESTAMP | 返回系統(tǒng)當前日期和時間 | ?? | ?? | ?? | ?? | ?? |
EXTRACT(p FROM dt) | 提取日期中的部分信息 | ?? | ?? | DATEPART(p, dt) | ?? | STRFTIME |
dt1 - dt2 | 計算兩個日期之間的天數(shù) | DATEDIFF(dt2, dt1) | ?? | DATEDIFF(p, dt1, dt2) | ?? | STRFTIME |
dt + INTERVAL | 日期加上一個時間間隔 | ?? | ?? | DATEADD(p, n, dt) | ?? | STRFTIME |
下面我們通過一些示例來說明這些函數(shù)的作用和注意事項。
返回當前日期和時間
CURRENT_DATE、CURRENT_TIME 以及 CURRENT_TIMESTAMP 函數(shù)分別返回了數(shù)據(jù)庫系統(tǒng)當前的日期、時間以及時間戳(日期和時間)。例如:
-- MySQL、PostgreSQL 以及 SQLite
SELECT CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP;
查詢返回的結果取決于我們執(zhí)行語句的時間。
CURRENT_DATE|CURRENT_TIME|CURRENT_TIMESTAMP
------------|------------|-------------------
2021-06-20| 15:32:44|2021-06-20 15:32:44
Oracle 中的日期類型包含了日期和時間信息,Oracle 不支持 CURRENT_TIME 函數(shù)。例如:
-- Oracle
SELECT CURRENT_DATE, CURRENT_TIMESTAMP
FROM dual;
查詢返回的結果如下:
CURRENT_DATE |CURRENT_TIMESTAMP
-------------------|-------------------
2021-06-20 15:40:27|2021-06-21 15:40:27
在 Microsoft SQL Server 中,需要使用 GETDATE 函數(shù)返回當前時間戳,然后通過類型轉換函數(shù) CAST(expr AS type)將結果轉換為日期或者時間類型。例如:
-- Microsoft SQL Server
SELECT CAST(GETDATE() AS DATE), CAST(GETDATE() AS TIME), CURRENT_TIMESTAMP;
下一篇我們將會介紹類型轉換函數(shù),查詢返回的結果如下:
DATE |TIME |CURRENT_TIMESTAMP
----------|--------|-------------------
2021-06-20|15:47:47|2021-06-20 15:47:47
提取日期中的部分信息
EXTRACT(p FROM dt)函數(shù)提取日期時間中的部分信息,例如年、月、日、時、分、秒等。例如:
-- Oracle、MySQL 以及 PostgreSQL
SELECT EXTRACT(YEAR FROM hire_date)
FROM employee
WHERE emp_id = 1;
函數(shù)參數(shù)中的 YEAR 表示提取年份信息,查詢返回的結果如下:
EXTRACT(YEAR FROM hire_date)
----------------------------
2000
除提取年份信息外,我們也可以使用 MONTH、DAY、HOUR、MINUTE、SECOND 等參數(shù)提取日期中的其他信息。
Microsoft SQL Server 使用 DATEPART(p, dt)函數(shù)提取日期中的信息。例如:
-- Microsoft SQL Server
SELECT DATEPART(YEAR, hire_date)
FROM employee
WHERE emp_id = 1;
函數(shù)參數(shù)中的 YEAR 表示提取年份信息,同樣也可以使用 MONTH、DAY、HOUR、MINUTE、SECOND 等參數(shù)提取日期中的其他信息。查詢返回的結果與上面的示例相同。
SQLite 提供了日期格式化函數(shù) STRFTIME,可以提取日期中的信息。例如:
-- SQLite
SELECT STRFTIME('%Y', hire_date)
FROM employee
WHERE emp_id = 1;
函數(shù)中的第一個參數(shù)%Y 代表 4 位數(shù)的年份,我們也可以使用%m、%d、%H、%M、%S 等參數(shù)提取日期中的其他信息。查詢返回的結果與上面的示例相同。
日期的加減運算
日期的加減運算主要包括兩個日期相減以及一個日期加/減一個時間間隔。例如:
-- Oracle 和 PostgreSQL
SELECT DATE '2021-03-01' - DATE '2021-02-01',
DATE '2021-02-01' + INTERVAL '-1' MONTH
FROM employee
WHERE emp_id = 1;
在 Oracle 和 PostgreSQL 中,兩個日期相減就可以得到它們之間相差的天數(shù),日期加上一個時間間隔(INTERVAL)就可以得到一個新的日期。查詢返回的結果如下:
DATE'2021-03-01'-DATE'2021-02-01'|DATE'2021-02-01'+INTERVAL'-1'MONTH
---------------------------------|----------------------------------
28| 2021-01-01 00:00:00
2021 年 2 月有 28 天,2021 年 2 月 1 日減去一個月是 2021 年 1 月 1 日。
MySQL 使用 DATEDIFF(dt2, dt1) 函數(shù)計算日期 dt2 減去日期 dt1 得到的天數(shù),例如:
-- MySQL
SELECT DATEDIFF(DATE '2021-03-01', DATE '2021-02-01'),
DATE '2021-02-01' + INTERVAL '-1' MONTH;
查詢返回的結果和上面的示例相同。
Microsoft SQL Server 使用 DATEDIFF(p, dt1, dt2)函數(shù)計算日期 dt2 減去日期 dt1 得到的時間間隔,使用 DATEADD(p, n, dt)函數(shù)為日期增加一個時間間隔。例如:
-- Microsoft SQL Server
SELECT DATEDIFF(DAY, '2021-02-01', '2021-03-01'),
DATEADD(MONTH, -1, '2021-02-01');
DATEDIFF 函數(shù)中的第一個參數(shù)(DAY)表示計算第二個日期減去第一個日期的天數(shù),也可以返回月數(shù)(MONTH)或者年數(shù)(YEAR)等。DATEADD 函數(shù)在 2021 年 2 月 1 日的基礎上增加了-1 個月,也就是減去 1 個月。查詢返回的結果和上面的示例相同。
SQLite 可以利用 STRFTIME 函數(shù)實現(xiàn)兩個日期的相減,或者為日期增加一個時間間隔。例如:
-- SQLite
SELECT STRFTIME('%J', '2021-03-01') - STRFTIME('%J', '2021-02-01'),
STRFTIME('%Y-%m-%d', '2021-02-01', '-1 months');
前兩個 STRFTIME 函數(shù)中的參數(shù)%J 表示將日期轉換為儒略日(Julian Day)。第 3 個STRFTIME 函數(shù)格式化日期的同時增加了一個時間間隔。查詢返回的結果和上面的示例相同。