SQL Date

日期資料型態 (SQL Date Data Types)

這篇 SQL 日期函數教學介紹資料庫中常用的日期資料型態與日期函數。一般資料庫都有提供表示日期的資料型態 (Date Data Types),搭配 SELECT 語句可以靈活查詢日期相關資料。

MySQL 日期資料型態

MySQL 中常用的日期資料型態如下:

資料型態格式說明
DATEYYYY-MM-DD日期
DATETIMEYYYY-MM-DD HH:MI:SS日期與時間
TIMESTAMPYYYY-MM-DD HH:MI:SS時間戳記
YEARYYYY 或 YY年份

SQL Date 函數 (SQL Date Functions)

以下是一些常用的 SQL 日期函數:

函數說明
NOW()返回目前的日期與時間
CURDATE()返回目前的日期
CURTIME()返回目前的時間
DATE()提取日期部分
YEAR()提取年份
MONTH()提取月份
DAY()提取日

日期函數用法 (Example)

假設我們有一個訂單資料表 orders 如下(若需了解如何建立資料表,請參考 CREATE TABLE 教學):

OrderIdProductNameOrderDate
1蘋果2024-11-01
2香蕉2024-11-15
3橘子2024-12-01

我們可以使用 DATE 函數搭配 WHERE 子句來查詢特定日期的訂單:

SELECT * FROM orders
WHERE DATE(OrderDate) = '2024-11-01';

查詢結果如下:

OrderIdProductNameOrderDate
1蘋果2024-11-01

各資料庫日期函數差異 (Date Functions Across Databases)

不同的資料庫系統在日期函數的語法上有所差異,以下整理了 MySQL、SQL Server、PostgreSQL 和 Oracle 中常用的日期操作函數,幫助你在不同資料庫環境下靈活運用。

日期格式化 (Date Formatting)

將日期轉換為指定格式的字串,各資料庫的語法如下:

資料庫語法範例
MySQLDATE_FORMAT(date, format)DATE_FORMAT(NOW(), ‘%Y-%m-%d’)
SQL ServerFORMAT(date, format)FORMAT(GETDATE(), ‘yyyy-MM-dd’)
PostgreSQLTO_CHAR(date, format)TO_CHAR(NOW(), ‘YYYY-MM-DD’)
OracleTO_CHAR(date, format)TO_CHAR(SYSDATE, ‘YYYY-MM-DD’)

以 MySQL 為例,使用 DATE_FORMAT 將訂單日期格式化為「年/月」的格式:

SELECT ProductName, DATE_FORMAT(OrderDate, '%Y/%m') AS FormattedDate
FROM orders;

查詢結果如下:

ProductNameFormattedDate
蘋果2024/11
香蕉2024/11
橘子2024/12

日期加減運算 (Date Addition)

在日期上加上或減去一段時間間隔,各資料庫的語法差異較大:

資料庫語法加 7 天的範例
MySQLDATE_ADD(date, INTERVAL n unit)DATE_ADD(‘2024-11-01’, INTERVAL 7 DAY)
SQL ServerDATEADD(unit, n, date)DATEADD(DAY, 7, ‘2024-11-01’)
PostgreSQLdate + INTERVAL ‘n unit’‘2024-11-01’::date + INTERVAL ‘7 days’
Oracledate + n(天數)TO_DATE(‘2024-11-01’, ‘YYYY-MM-DD’) + 7

以 MySQL 為例,查詢每筆訂單 7 天後的日期:

SELECT ProductName, OrderDate,
       DATE_ADD(OrderDate, INTERVAL 7 DAY) AS DeliveryDate
FROM orders;

查詢結果如下:

ProductNameOrderDateDeliveryDate
蘋果2024-11-012024-11-08
香蕉2024-11-152024-11-22
橘子2024-12-012024-12-08

日期差異計算 (Date Difference)

計算兩個日期之間的差異,各資料庫的寫法也不盡相同:

資料庫語法說明
MySQLDATEDIFF(date1, date2)回傳天數差(date1 – date2)
SQL ServerDATEDIFF(unit, start, end)可指定回傳單位(DAY、MONTH、YEAR 等)
PostgreSQLdate1 – date2直接相減,回傳天數
Oracledate1 – date2直接相減,回傳天數(含小數)

以 MySQL 為例,計算每筆訂單距離今天過了幾天:

SELECT ProductName, OrderDate,
       DATEDIFF(CURDATE(), OrderDate) AS DaysAgo
FROM orders;

了解各資料庫之間日期函數的差異,可以幫助你在切換不同資料庫環境時更快速地撰寫正確的 SQL 語句。建議在開發時先確認目標資料庫的日期函數語法,避免因語法差異導致查詢錯誤。

延伸閱讀