SQL:1992 (SQL-92) 定義了三大核心日期時間類型:`DATE`、`TIME`、`TIMESTAMP`,並提供 `WITH TIME ZONE` 變體。各資料庫廠商實作長度、格式、精度略有差異,但核心語義一致。本文依標準規格說明,實際開發請參閱對應資料庫文件。
| 屬性 | 規格 |
|---|---|
| 語法 | `DATE` (無參數) |
| 欄位 | 年 (YYYY)、月 (MM)、日 (DD) |
| 長度 | 10 字元:`YYYY-MM-DD` |
| 比較 | 僅能與 DATE 型別比較 |
| 有效值 | 符合公曆規範 |
SQL Server 對應:`DATE` (2008+),2005 僅有 `DATETIME`/`SMALLDATETIME`,需自行剖析日期部分。
| 屬性 | 規格 |
|---|---|
| 語法 | `TIME[(precision)]` |
| 欄位 | 時 (hh)、分 (mm)、秒 (ss)、秒小數 (.ffff...) |
| 格式 | `hh:mm:ss[.ffff...]` |
| 精度 | 可選,預設 0 (秒);最大視實作而定 |
| 基準 | UTC (世界協調時間),00:00:00 = 格林威治午夜 |
| 長度 | 8 字元 (無小數) + 1 (小數點) + precision |
| 比較 | 僅能與 TIME 型別比較 |
TIME WITH TIME ZONE:`TIME(precision) WITH TIME ZONE`,含時區位移 `+hh:mm` (範圍 -12:59 ~ +13:00),總長 14 + precision + 1 (分隔符)。
SQL Server 對應:`TIME` (2008+),精度 0~7 (100ns);2005 無獨立 TIME 型別。
| 屬性 | 規格 |
|---|---|
| 語法 | `TIMESTAMP[(precision)]` |
| 欄位 | 年、月、日、時、分、秒、秒小數 |
| 格式 | `YYYY-MM-DD hh:mm:ss[.ffff...]` |
| 日期部分 | 公曆 |
| 時間部分 | UTC,預設本地時區 |
| 長度 | 19 字元 + precision + 1 (小數點) |
| 預設精度 | 標準 6,但許多廠商預設 0 (秒) |
| 比較 | 僅能與 TIMESTAMP 型別比較 |
TIMESTAMP WITH TIME ZONE:含時區位移,總長 25 + precision + 1。
SQL Server 對應:
SQL-92 僅定義單一 `INTERVAL` 類型,兩種限定詞:
| 限定詞類型 | 格式 | 欄位 | 範例 |
|---|---|---|---|
| Year-Month | `INTERVAL YEAR TO MONTH` | 年、月 | `INTERVAL '10-5' YEAR TO MONTH` (10年5月) |
| Day-Time | `INTERVAL DAY TO SECOND[(precision)]` | 日、時、分、秒、秒小數 | `INTERVAL '3 12:30:15.5' DAY TO SECOND` |
SQL Server 對應:無原生 INTERVAL 型別。常用做法:
| 標準 | SQL Server 2005 | SQL Server 2008+ |
|---|---|---|
| `EXTRACT(YEAR FROM dt)` | `YEAR(dt)` | `DATEPART(YEAR, dt)` |
| `CURRENT_DATE` | `GETDATE()` (含時間) | `CAST(GETDATE() AS DATE)` |
| `CURRENT_TIMESTAMP` | `GETDATE()` | `SYSDATETIME()` (高精度) |
| `dt1 - dt2` | `DATEDIFF(day, dt2, dt1)` | `DATEDIFF_BIG` (大間隔) |
| `dt + INTERVAL '1' DAY` | `DATEADD(day, 1, dt)` | 同左 |
下一篇將進入數值資料類型篇,詳細解析 `NUMERIC`、`DECIMAL`、`FLOAT`、`REAL`、`MONEY` 等型別精度、刻度、儲存大小與運算規則。