TDengine NOW() 函数用户使用手册
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 智能体对数据进行预测与异常检测,提供实时的商业洞察。