SQL:2003 標準定義 CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP,但各廠商實作與擴展函數差異極大,跨平台遷移時須特別注意。
| 資料庫 | 日期+時間 | 僅日期 | 僅時間 | 備註 |
|---|---|---|---|---|
| Oracle | SYSDATE / SYSTIMESTAMP | TRUNC(SYSDATE) | TO_CHAR(SYSDATE,'HH24:MI:SS') | 需 FROM DUAL;SYSTIMESTAMP 含時區/毫秒 |
| DB2 | CURRENT TIMESTAMP | CURRENT DATE | CURRENT TIME | 標準 SQL,FROM SYSIBM.SYSDUMMY1 可省略 |
| MySQL | NOW() / SYSDATE() | CURDATE() / CURRENT_DATE | CURTIME() / CURRENT_TIME | NOW() 語句開始固定;SYSDATE() 即時動態 |
| SQL Server | GETDATE() / SYSDATETIME() | CAST(GETDATE() AS DATE) | CAST(GETDATE() AS TIME) | 2008+ 支援 SYSDATETIME() 高精度 |
| PostgreSQL | NOW() / CURRENT_TIMESTAMP | CURRENT_DATE | CURRENT_TIME | 完整支援標準 SQL |
| Informix | CURRENT YEAR TO FRACTION(5) | TODAY | CURRENT HOUR TO SECOND | 精度可調 |
| Sybase ASE | GETDATE() | CONVERT(DATE,GETDATE()) | CONVERT(TIME,GETDATE()) | |
| SQLite | DATETIME('now') | DATE('now') | TIME('now') | 字串函數風格 |
| Teradata | CURRENT_TIMESTAMP | CURRENT_DATE | CURRENT_TIME | 標準 SQL |
| FoxPro/dBase | DATETIME() | DATE() | TIME() | 無 FROM 子句 |
SYSTIMESTAMP / PostgreSQL NOW() AT TIME ZONE / MySQL CONVERT_TZ();DB2 需配合 TIMEZONE 登錄變數。SYSDATE vs SYSTIMESTAMP (Oracle):前者精度至秒、後者至毫秒+時區,遷移時勿混用。NOW() vs SYSDATE() (MySQL):NOW() 在同一語句多次調用返回相同值;SYSDATE() 即時讀取,複制/觸發器中行為不同。GETDATE() 直接參與字串拼接會隱含轉換,建議顯式 CONVERT/FORMAT。
-- 標準 SQL(最可移植)
SELECT CURRENT_TIMESTAMP FROM sysibm.sysdummy1; -- DB2
SELECT CURRENT_TIMESTAMP; -- PostgreSQL, Teradata, Firebird
-- 應用層統一:由應用程式產生時間戳寫入,避免資料庫函數差異
-- 或建立統一 VIEW/函數封裝:
-- CREATE VIEW v_now AS SELECT CURRENT_TIMESTAMP AS now_ts FROM sysibm.sysdummy1;
CURRENT DATE + 7 DAYS
CURRENT TIMESTAMP - 3 HOURS
DATE('2024-01-15') + 1 MONTH
TIMESTAMPDIFF(4, CHAR(TIMESTAMP_2 - TIMESTAMP_1)) -- 回傳分鐘差