SQLite 雖輕量,但內建的日期時間處理功能相當強大。本文系統整理 SQLite 的核心時間函數、支援的輸入格式、格式化符號,並附上經實測驗證的實戰範例,幫助開發者快速掌握時間運算與轉換技巧。
SQLite 提供四個主要函數處理日期時間:
前三個函數語法一致:
datetime(時間字串, 修正符1, 修正符2, ...)
date(時間字串, 修正符1, ...)
time(時間字串, 修正符1, ...)
strftime() 則多一個格式參數:
strftime(格式字串, 時間字串, 修正符1, ...)
修正符可疊加,例如 '+3 hours'、'-12 minutes'、'start of month'、'localtime' 等,依序套用於基準時間。
以下格式皆可直接作為第一個參數傳入:
| 格式 | 範例 |
|---|---|
| YYYY-MM-DD | 2024-01-15 |
| YYYY-MM-DD HH:MM | 2024-01-15 14:30 |
| YYYY-MM-DD HH:MM:SS | 2024-01-15 14:30:45 |
| YYYY-MM-DD HH:MM:SS.SSS | 2024-01-15 14:30:45.123 |
| HH:MM | 14:30 |
| HH:MM:SS | 14:30:45 |
| HH:MM:SS.SSS | 14:30:45.123 |
| now | 當下時間(UTC) |
| 符號 | 意義 | 範圍/範例 |
|---|---|---|
| %d | 月份中的第幾天 | 01-31 |
| %f | 秒的小數部分 | SS.SSS |
| %H | 24 小制小時 | 00-23 |
| %j | 年間第幾天 | 001-366 |
| %m | 月份 | 01-12 |
| %M | 分鐘 | 00-59 |
| %s | Unix 時間戳(自 1970-01-01 秒數) | 1705327845 |
| %S | 秒 | 00-59 |
| %w | 星期幾 | 0-6 (0=週日) |
| %W | 年間第幾周 | 01-53 |
| %Y | 四位數年份 | 2024 |
| %% | 字面 % 符號 | % |
SELECT datetime('now');
結果:2024-01-15 14:30:45
SELECT datetime('2024-01-15');
結果:2024-01-15 00:00:00
SELECT datetime('2024-01-15 10:00:00', '+3 hours', '-12 minutes');
結果:2024-01-15 12:48:00
SELECT date('2024-01-15', '+1 day', '+1 year');
結果:2025-01-16
SELECT datetime('now', 'start of year'); -- 2024-01-01 00:00:00
SELECT datetime('now', 'start of month'); -- 2024-01-01 00:00:00
SELECT datetime('now', 'start of day'); -- 2024-01-15 00:00:00
SELECT datetime('now', '+10 hours', 'start of day', '+10 hours');
說明:先加 10 小時 → 歸零到當天 00:00:00 → 再加 10 小時 → 最終為 10:00:00。
-- UTC 轉本地時間
SELECT datetime('now', 'localtime');
-- UTC 手動轉東八區
SELECT datetime('now', '+8 hours');
SELECT strftime('%Y.%m.%d %H:%M:%S', 'now', 'localtime');
結果:2024.01.15 22:30:45
掌握 SQLite 時間函數的關鍵在於:理解「基準時間字串」與「修正符疊加順序」的關係,善用 strftime() 滿足各種輸出格式需求。實務上常見的「取本月第一天」、「計算 N 天前/後」、「時區轉換」皆能以單一 SQL 完成,無需應用層額外運算。