TDengine NOW() 函數用戶使用手冊
目錄
- 功能概述
- 函數語法
- 返回值說明
- 技術特性
- 使用場景及示例
- 時間運算操作
- 注意事項
- 常見問題
功能概述
NOW()
函數是 TDengine 中的時間函數,用于獲取客戶端當前系統時間。該函數在時序數據庫中特別有用,可以用于數據插入、時間過濾、時間計算等多種場景。
函數語法
NOW()
返回值說明
- 數據類型:TIMESTAMP
- 時間精度:與當前 DATABASE 設置的時間精度一致
- 時間格式:根據數據庫精度返回相應格式的時間戳
技術特性
時間精度支持
根據源碼分析,NOW() 函數支持以下時間精度:
- 毫秒精度 (TSDB_TIME_PRECISION_MILLI)
- 微秒精度 (TSDB_TIME_PRECISION_MICRO)
- 納秒精度 (TSDB_TIME_PRECISION_NANO)
適用范圍
- 表類型:適用于表和超級表
- 字段類型:在 WHERE 或 INSERT 語句中只能作用于 TIMESTAMP 類型字段
- 嵌套查詢:支持內層查詢和外層查詢
使用場景及示例
1. 基礎查詢獲取當前時間
-- 獲取當前系統時間
SELECT NOW() AS current_timestamp;
輸出示例:
+-------------------------+
| current_timestamp |
+-------------------------+
| 2025-09-03 14:30:25.123 |
+-------------------------+
2. 數據插入場景
創建表結構
-- 創建傳感器數據表
CREATE STABLE sensors (ts TIMESTAMP,temperature FLOAT,humidity FLOAT
) TAGS (device_id INT, location NCHAR(50));-- 創建子表
CREATE TABLE sensor_001 USING sensors TAGS (1, '北京機房');
插入當前時間數據
-- 使用 NOW() 插入當前時間戳
INSERT INTO sensor_001 VALUES (NOW(), 25.6, 60.8);-- 批量插入多條記錄
INSERT INTO sensor_001 VALUES (NOW(), 25.6, 60.8),(NOW() - 1m, 25.2, 61.2),(NOW() - 2m, 24.8, 61.5);
3. 數據查詢和過濾
查詢最近時間范圍的數據
-- 查詢最近1小時的數據
SELECT * FROM sensor_001
WHERE ts > NOW() - 1h;-- 查詢最近24小時的數據
SELECT * FROM sensor_001
WHERE ts BETWEEN NOW() - 1d AND NOW();-- 查詢今天的數據
SELECT * FROM sensor_001
WHERE ts >= TODAY() AND ts < NOW();
實時數據監控
-- 查詢最近5分鐘內的平均溫度
SELECT AVG(temperature) as avg_temp
FROM sensor_001
WHERE ts > NOW() - 5m;-- 查詢當前時間前后30秒的數據
SELECT * FROM sensor_001
WHERE ts BETWEEN NOW() - 30s AND NOW() + 30s;
4. 時間差計算
-- 計算數據記錄距離當前時間的秒數差
SELECT ts, temperature, (NOW() - ts) / 1000000 AS seconds_ago
FROM sensor_001
ORDER BY ts DESC
LIMIT 10;-- 查找超過1小時未更新的設備
SELECT device_id, MAX(ts) as last_update,(NOW() - MAX(ts)) / 1000000 / 3600 AS hours_since_update
FROM sensors
GROUP BY device_id
HAVING hours_since_update > 1;
5. 數據分析場景
按時間窗口聚合
-- 按小時聚合最近24小時的數據
SELECT _wstart as hour_start,AVG(temperature) as avg_temp,MAX(temperature) as max_temp,MIN(temperature) as min_temp
FROM sensor_001
WHERE ts > NOW() - 1d
INTERVAL(1h);-- 實時滑動窗口分析
SELECT _wstart,COUNT(*) as record_count,AVG(temperature) as avg_temp
FROM sensor_001
WHERE ts > NOW() - 2h
INTERVAL(10m) SLIDING(1m);
時間運算操作
NOW() 函數支持時間加減運算,支持的時間單位包括:
時間單位 | 符號 | 說明 | 示例 |
---|---|---|---|
納秒 | b | nanosecond | NOW() + 100b |
微秒 | u | microsecond | NOW() - 500u |
毫秒 | a | millisecond | NOW() + 200a |
秒 | s | second | NOW() - 30s |
分鐘 | m | minute | NOW() + 15m |
小時 | h | hour | NOW() - 2h |
天 | d | day | NOW() + 1d |
周 | w | week | NOW() - 1w |
時間運算示例
-- 各種時間單位的運算示例
SELECT NOW() as current_time,NOW() + 1s as one_second_later,NOW() - 30m as thirty_minutes_ago,NOW() + 2h as two_hours_later,NOW() - 1d as yesterday_same_time,NOW() + 1w as next_week_same_time;-- 復合時間運算
SELECT * FROM sensor_001
WHERE ts BETWEEN NOW() - 1d - 30m AND NOW() - 30m;-- 時間邊界查詢
SELECT * FROM sensor_001
WHERE ts > NOW() - 1h + 100a; -- 1小時前再加100毫秒
注意事項
1. 時間精度一致性
-- 確保時間精度與數據庫設置一致
-- 如果數據庫精度為毫秒,NOW() 返回毫秒精度時間戳
-- 如果數據庫精度為微秒,NOW() 返回微秒精度時間戳
2. 客戶端時間 vs 服務器時間
-- NOW() 返回客戶端系統時間,不是服務器時間
-- 在分布式環境中需要注意時間同步問題
3. 性能考慮
-- 在大量數據查詢中,建議將 NOW() 的結果先計算出來
-- 避免在循環或大量記錄處理中重復調用 NOW()-- 推薦做法
SELECT @current_time := NOW();
SELECT * FROM sensor_001 WHERE ts > @current_time - 1h;-- 不推薦在大數據量情況下
SELECT * FROM huge_table WHERE ts > NOW() - 1h; -- 每行都會計算NOW()
常見問題
Q1: NOW() 與 TODAY() 的區別?
-- NOW() 返回完整的當前時間戳(包含時分秒)
SELECT NOW(); -- 2025-09-03 14:30:25.123-- TODAY() 返回當前日期的0點時間戳
SELECT TODAY(); -- 2025-09-03 00:00:00.000
Q2: 如何處理時區問題?
-- TDengine 中的時間戳通常是UTC時間
-- 需要在應用層進行時區轉換
-- 或使用時區相關函數進行處理
Q3: 在INSERT語句中使用NOW()的最佳實踐?
-- 對于實時數據,推薦使用NOW()
INSERT INTO sensor_001 VALUES (NOW(), 25.6, 60.8);-- 對于批量導入歷史數據,使用具體時間戳
INSERT INTO sensor_001 VALUES ('2025-09-03 10:00:00', 25.1, 60.2),('2025-09-03 10:01:00', 25.3, 60.5);
Q4: NOW()在WHERE子句中的優化?
-- 對于頻繁查詢,可以預先計算時間邊界
SET @start_time = NOW() - 1h;
SET @end_time = NOW();SELECT * FROM sensor_001
WHERE ts BETWEEN @start_time AND @end_time;
總結
NOW() 函數是 TDengine 中非常重要的時間函數,特別適用于:
- 實時數據插入和時間戳記錄
- 時間范圍查詢和數據過濾
- 時間差計算和數據分析
- 實時監控和報警系統
正確使用 NOW() 函數可以大大提高時序數據處理的效率和準確性。在實際應用中,需要注意時間精度、性能優化和時區處理等方面的問題。
關于 TDengine
TDengine 是一款專為物聯網、工業互聯網等場景設計并優化的大數據平臺,其核心模塊是高性能、集群開源、云原生、極簡的時序數據庫。
它能安全高效地將大量設備每天產生的高達 TB 甚至 PB 級的數據進行匯聚、存儲、分析和分發,并提供 AI 智能體對數據進行預測與異常檢測,提供實時的商業洞察。