
TIMEZONE
sql
TIMEZONE()
功能说明:返回客户端当前的时区信息。
版本:v3.0.0.0
返回结果类型:VARCHAR。
适用数据类型:无参数。
嵌套子查询支持:适用于内层查询和外层查询。
适用于:表和超级表。
使用说明:
-
时区级别:
- TIMEZONE 函数返回的是客户端进程级别的时区设置,而非系统级别或服务器端的时区。
- 时区信息在客户端连接建立时确定,由客户端配置文件、环境变量或连接参数指定。
-
时区格式:
- 返回的时区格式为标准的 UTC 偏移格式,如
+08:00(东八区)、-05:00(西五区)、+00:00(UTC)等。 - 格式规范为:
[+/-]HH:MM,其中 HH 表示小时偏移(00-14),MM 表示分钟偏移(00 或 30)。
- 返回的时区格式为标准的 UTC 偏移格式,如
-
时区来源优先级 :
时区按以下优先级确定(从高到低):
- 连接字符串中指定的 timezone 参数
- 客户端配置文件(taos.cfg)中的 timezone 参数
- 环境变量 TZ
- 系统默认时区
-
应用场景:
- 确认当前客户端的时区设置,避免时间转换错误
- 在时间函数中配合使用,确保时区一致性
- 调试时间相关的查询问题
- 生成包含时区信息的报表
-
与其他时间函数配合:
- 与
TO_ISO8601()配合,生成带时区信息的 ISO8601 格式时间 - 与
TIMETRUNCATE()配合,进行时区相关的时间截断 - 与
NOW()、TODAY()配合,明确当前时间的时区环境
- 与
-
实现机制:
- 函数直接读取客户端连接上下文中的时区配置
- 不涉及网络通信,性能开销极小
- 在同一连接会话中,多次调用返回相同的值
举例:
(注意:示例中的时区取决于客户端配置)
sql
-- 查看当前客户端时区
taos> SELECT TIMEZONE();
timezone() |
====================
+08:00 |
-- 在查询中使用,了解数据存储和显示的时区环境
taos> SELECT NOW(), TIMEZONE();
now() | timezone() |
==================================================
2024-01-15 10:30:25.000 | +08:00 |
-- 配合 TO_ISO8601 使用,生成带时区的时间戳
taos> SELECT ts, TO_ISO8601(ts), TIMEZONE() FROM meters LIMIT 1;
ts | to_iso8601(ts) | timezone() |
======================================================================================
2024-01-15 10:30:25.000 | 2024-01-15T10:30:25.000+08:00 | +08:00 |
-- 验证不同时区下的时间显示
taos> SELECT ts, TIMEZONE() as client_tz FROM meters WHERE ts >= '2024-01-15 00:00:00' LIMIT 3;
ts | client_tz |
============================================
2024-01-15 08:00:00.000 | +08:00 |
2024-01-15 12:00:00.000 | +08:00 |
2024-01-15 18:00:00.000 | +08:00 |
TIMEZONE 函数智能电表应用场景
场景一:验证多地区电表数据的时区一致性
业务需求:电力公司在不同地区部署了电表,需要确保所有查询都在正确的时区下进行,避免时间错位。
sql
-- 验证当前客户端时区设置
SELECT TIMEZONE() AS current_timezone;
-- 查询电表数据并显示时区
SELECT
tbname AS meter_id,
location,
ts,
current,
voltage,
TIMEZONE() AS query_timezone
FROM meters
WHERE ts >= '2024-01-15 00:00:00' AND ts < '2024-01-16 00:00:00'
LIMIT 5;
预期输出示例:
meter_id | location | ts | current | voltage | query_timezone |
====================================================================================================
d1001 | Beijing.Chaoyang | 2024-01-15 08:00:00.000 | 12.5 | 220 | +08:00 |
d1001 | Beijing.Chaoyang | 2024-01-15 12:00:00.000 | 15.2 | 221 | +08:00 |
场景二:生成带时区信息的电表数据报表
业务需求:导出电表数据报表时,需要明确标注数据所在的时区,方便跨时区协作。
sql
-- 生成包含时区信息的报表
SELECT
DATE(ts) AS report_date,
TIMEZONE() AS report_timezone,
COUNT(*) AS reading_count,
ROUND(AVG(current), 2) AS avg_current,
ROUND(AVG(voltage), 2) AS avg_voltage
FROM meters
WHERE ts >= '2024-01-15 00:00:00' AND ts < '2024-01-22 00:00:00'
GROUP BY DATE(ts)
ORDER BY report_date;
预期输出示例:
report_date | report_timezone | reading_count | avg_current | avg_voltage |
==============================================================================
2024-01-15 | +08:00 | 17 | 10.40 | 220.35 |
2024-01-16 | +08:00 | 3 | 10.60 | 220.67 |
场景三:跨时区电表数据对比分析
业务需求:当电力公司在不同时区有业务时,需要在查询中明确当前时区,便于数据对比。
sql
-- 对比不同时区的查询结果
SELECT
'Beijing Time (UTC+8)' AS timezone_label,
TIMEZONE() AS actual_timezone,
COUNT(*) AS total_readings,
MIN(ts) AS earliest_time,
MAX(ts) AS latest_time
FROM meters
WHERE ts >= '2024-01-15 00:00:00' AND ts < '2024-01-16 00:00:00';
-- 注意:如果需要查看其他时区的数据,需要在客户端重新连接并设置时区
预期输出示例:
timezone_label | actual_timezone | total_readings | earliest_time | latest_time |
=======================================================================================================================
Beijing Time (UTC+8) | +08:00 | 17 | 2024-01-15 00:00:00.000 | 2024-01-15 23:00:00.000 |
场景四:生成 ISO8601 格式的时间戳(含时区)
业务需求:为了与国际标准接轨,需要将电表数据的时间戳转换为 ISO8601 格式,并携带时区信息。
sql
-- 生成符合 ISO8601 标准的时间戳
SELECT
tbname AS meter_id,
TO_ISO8601(ts) AS iso_timestamp,
TIMEZONE() AS timezone,
current,
voltage
FROM meters
WHERE ts >= '2024-01-15 08:00:00' AND ts < '2024-01-15 09:00:00'
ORDER BY ts
LIMIT 5;
预期输出示例:
meter_id | iso_timestamp | timezone | current | voltage |
=================================================================================
d1001 | 2024-01-15T08:00:00.000+08:00 | +08:00 | 12.5 | 220 |
d1002 | 2024-01-15T08:00:00.000+08:00 | +08:00 | 11.8 | 219 |
场景五:时区配置验证与故障排查
业务需求:在部署新的监控系统或迁移数据时,需要验证时区配置是否正确。
sql
-- 验证时区配置
SELECT
'System Check' AS check_type,
TIMEZONE() AS configured_timezone,
NOW() AS current_server_time,
CAST(NOW() AS BIGINT) AS timestamp_ms;
-- 对比预期时间和实际时间
SELECT
'2024-01-15 08:00:00 should be' AS description,
TO_TIMESTAMP('2024-01-15 08:00:00', 'yyyy-mm-dd hh24:mi:ss') AS parsed_time,
TIMEZONE() AS in_timezone;
使用说明:
- 如果 TIMEZONE() 返回的时区不符合预期,需要检查客户端配置
- 可以通过修改客户端配置文件(taos.cfg)中的 timezone 参数来调整
- 或者在连接字符串中指定时区:
taos://localhost:6030?timezone=UTC+8 - 指定时间范围内有数据,但按此区间过滤后显示没有数据,要检查客户端时间是否与服务器一致, where 语句中输入的时间使用的是客户端时区。
场景六:多时区电表数据汇总分析
业务需求:电力公司在多个时区运营,需要在统一时区下汇总分析数据。
sql
-- 显示当前查询时区并汇总数据
SELECT
TIMEZONE() AS analysis_timezone,
COUNT(DISTINCT tbname) AS total_meters,
COUNT(*) AS total_readings,
DATE(MIN(ts)) AS data_start_date,
DATE(MAX(ts)) AS data_end_date,
ROUND(AVG(current), 2) AS avg_current,
ROUND(AVG(voltage), 2) AS avg_voltage
FROM meters
WHERE ts >= '2024-01-15 00:00:00' AND ts < '2024-01-22 00:00:00';
预期输出示例:
analysis_timezone | total_meters | total_readings | data_start_date | data_end_date | avg_current | avg_voltage |
=====================================================================================================================
+08:00 | 4 | 27 | 2024-01-15 | 2024-01-21 | 11.15 | 220.22 |
TIMEZONE 函数使用最佳实践
时区配置方法
方法一:配置文件设置(推荐)
在客户端配置文件 taos.cfg 中设置:
ini
# 设置为东八区(北京时间)
timezone UTC+8
# 或者使用地理位置
# timezone Asia/Shanghai
方法二:环境变量设置
bash
# Linux/macOS
export TZ="Asia/Shanghai"
# Windows
set TZ=Asia/Shanghai
方法三:连接字符串指定
python
# Python 示例
import taos
conn = taos.connect(
host="localhost",
user="root",
password="taosdata",
timezone="UTC+8"
)
时区相关注意事项
-
客户端与服务器时区:
- 服务器端存储的时间戳是 UTC 时间
- 客户端查询时会根据配置的时区进行转换显示
- TIMEZONE() 返回的是客户端时区,不是服务器时区
-
时间输入建议:
sql-- ✅ 推荐:明确指定时区 SELECT * FROM meters WHERE ts >= '2024-01-15 08:00:00+08:00'; -- ⚠️ 注意:依赖客户端时区设置 SELECT * FROM meters WHERE ts >= '2024-01-15 08:00:00'; -
跨时区查询:
sql-- 查询时明确时区上下文 SELECT TIMEZONE() AS query_tz, TO_ISO8601(ts) AS time_with_tz, current, voltage FROM meters WHERE ts BETWEEN '2024-01-15T00:00:00+08:00' AND '2024-01-16T00:00:00+08:00'; -
报表生成建议:
- 在报表中始终包含 TIMEZONE() 的输出
- 使用 TO_ISO8601() 生成标准格式的时间戳
- 在文档中明确说明报表使用的时区
常见问题排查
问题一:时间显示不正确
sql
-- 检查当前时区设置
SELECT TIMEZONE();
-- 检查数据的实际存储时间
SELECT ts, TO_ISO8601(ts), CAST(ts AS BIGINT) FROM meters LIMIT 1;
问题二:跨时区数据对比
sql
-- 使用 ISO8601 格式确保时区信息完整
SELECT
location,
TO_ISO8601(ts) AS timestamp_with_tz,
current
FROM meters
WHERE location IN ('Beijing.Chaoyang', 'NewYork.Manhattan')
AND ts >= '2024-01-15T00:00:00+08:00'
ORDER BY ts;
相关函数
- NOW - 返回客户端当前系统时间
- TODAY - 返回客户端当日零时的系统时间
- TO_ISO8601 - 将时间戳转换为 ISO8601 格式
- TO_TIMESTAMP - 将字符串转换为时间戳
- TIMETRUNCATE - 按指定时间单位截断时间戳
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。