MySQL NOW 函數完整指南|從基礎到進階徹底解析

1. MySQL NOW 函數的概述

MySQL 的 NOW 函數是用於在資料庫中簡單取得目前日期與時間的函數。透過活用 NOW 函數,可取得資料插入時的時間戳記以及對日誌記錄有幫助的時間資訊。雖然簡單卻非常強大的工具,已被廣泛使用。

NOW 函數的基本語法

NOW 函數的語法非常簡單。使用以下查詢即可取得目前的日期時間。
SELECT NOW();
執行結果會以 YYYY-MM-DD HH:MM:SS 的格式回傳。例如,若是 2024 年 10 月 24 日 16 時 30 分,則會得到以下結果。
2024-10-24 16:30:00
此外,NOW 函數會根據資料庫的時區回傳目前的日期時間。藉此,可在整個系統中實現統一的時間管理。

NOW 函數的用途

NOW 函數在以下情境中特別便利。
  • 日誌記錄: 自動記錄資料的變更時間與插入時間。
  • 時間戳記: 用於記錄使用者操作的時間點。
  • 時間依賴的篩選: 用於抽取在特定期間內發生的資料。

2. NOW函數的基本使用範例

讓我們來看看利用 NOW 函數取得目前日期時間的基本使用範例。
SELECT NOW();
此查詢會回傳目前的日期時間。除了以字串形式取得外,也可以以數值形式取得。使用下列查詢,可以數值形式(YYYYMMDDHHMMSS)回傳目前的日期時間。
SELECT NOW() + 0;
例如,結果會以「20241024163000」的形式回傳,對於以數值形式處理時相當方便。

小數秒的精度指定

在 NOW 函數中,可以指定小數秒的精度。如下使用參數指定精度。
SELECT NOW(3);
此查詢會回傳具有小數點以下 3 位精度的結果。例如「2024-10-24 16:30:00.123」的形式。對於需要秒級精度的系統而言,這是一項非常便利的功能。

3. SYSDATE() 與 NOW() 的差異

NOW 函數與相似的函數 SYSDATE() 雖然存在,但它們的運作稍有不同。
  • NOW(): 取得查詢執行時的時間,整個語句中保持相同的時間。即使交易持續很長時間,也會返回相同的結果。
  • SYSDATE(): 在查詢的每個步驟取得當時的時間。也就是說,即使在長時間的交易中,也會取得即時的時間。
例如,在長時間執行的批次處理等情況下,SYSDATE() 能提供較精確的結果,但若重視交易的一致性,則建議使用 NOW()。

查詢內差異的範例

以下為示範 SYSDATE() 與 NOW() 動作差異的查詢範例。
SELECT NOW(), SYSDATE();
結果如下。
NOW():     2024-10-24 16:30:00
SYSDATE(): 2024-10-24 16:30:01
查詢執行瞬間的時間差在 SYSDATE() 中會被反映,而 NOW() 則保留查詢開始執行的時間。如此,兩者的運作雖略有不同,但依使用情境選擇最適合的函式是很重要的。

4. NOW函數的應用範例

NOW函數在特定情境下非常有用。例如,想要自動記錄資料插入的日期時間時,可如下使用NOW函數。
INSERT INTO users (username, created_at) 
VALUES ('example_user', NOW());
因此,於記錄插入時間會自動記錄到created_at欄位。此功能在日誌記錄與事件追蹤上尤其受到重視。 此外,若要抽取過去7天內建立的資料,可如下活用NOW函數。
SELECT * FROM orders
WHERE order_date >= NOW() - INTERVAL 7 DAY;
此查詢會取得從現在的日期時間起,過去7天內建立的所有記錄。對於依時間而定的資料抽取,NOW函數相當有效。

5. NOW 函數的注意事項

使用 NOW 函數時,有幾項需要注意的地方。特別是因為可能會影響交易的完整性,所以需要留意使用的情境。
  • 交易內的運作: NOW 函數會在交易內返回一致的結果,即使在長時間的處理過程中也會回傳相同的時間。這對於維持資料的完整性非常重要。然而,若需要即時的時間,使用 SYSDATE() 會比較適合。
此外,NOW 函數依賴時區,可能因系統設定而返回不同的結果,這點也需要注意。在全球化的應用程式中,需要考慮此點來設計。