TDengine 时序函数 NOW() 用户手册

发布于:2025-09-08 ⋅ 阅读:(23) ⋅ 点赞:(0)

在这里插入图片描述

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 智能体对数据进行预测与异常检测,提供实时的商业洞察。


网站公告

今日签到

点亮在社区的每一天
去签到