現象描述
在 Windows 2000 + SQL Server 7.0 環境中,手動修改系統時間(如 12:00 → 13:00)後,立即呼叫 `GETDATE()` 仍回傳舊時間,約 30~60 秒後才同步。
原因分析
- SQL Server 內部維護自己的時間快取,非即時讀取硬體時鐘
- 時間同步機制依賴 Windows 計時器中斷,約每分鐘更新一次內部時間
- 此為 SQL Server 7.0 已知行為,非 Bug
驗證與影響
- 僅影響 `GETDATE()`、`CURRENT_TIMESTAMP` 等系統函數
- 不影響交易記錄的 LSN 排序(LSN 由內部計數器產生)
- 不影響排程作業執行時間(SQL Server Agent 獨立讀取系統時間)
解決方案與建議
- 勿在交易邏輯中仰賴毫秒級時間精度
- 若需高精度時間戳記,應用層自行取得系統時間寫入
- 生產環境建議啟用 NTP 時間同步,避免人工改時間
- 升級至 SQL Server 2000 SP4 或更新版本,時間處理機制已改善
補充測試腳本
-- 觀察同步延遲
DECLARE @t DATETIME, @i INT = 0
WHILE @i < 120
BEGIN
SET @t = GETDATE()
PRINT CONVERT(VARCHAR, @t, 114) -- 顯示 hh:mi:ss:mmm
WAITFOR DELAY '00:00:01'
SET @i = @i + 1
END