TDengine 时间函数 WEEKOFYEAR() 用户手册
WEEKOFYEAR() 函数用户手册
函数定义
WEEKOFYEAR(expr)
功能说明
WEEKOFYEAR()
函数返回输入日期在一年中的第几周,采用 ISO 8601 标准的周数计算方式。该函数等同于 WEEK(expr, 3)
,即每周第一天是周一,第一个包含四天及以上的周为第 1 周。
版本要求
- 最低版本: v3.3.3.0
返回值
- 数据类型: BIGINT
- 取值范围: 1-53
- NULL 处理: 当输入为 NULL 时,返回 NULL
适用数据类型
支持以下类型的输入参数:
输入类型 | 说明 | 示例 |
---|---|---|
TIMESTAMP | 时间戳类型 | '2024-01-01 12:00:00' |
BIGINT | 表示时间戳的整数 | 1704067200000 |
VARCHAR | 符合 ISO8601/RFC3339 标准的日期时间字符串 | '2024-01-01' , '2024-01-01T12:00:00Z' |
NCHAR | 符合 ISO8601/RFC3339 标准的日期时间字符串 | '2024-01-01 12:00:00' |
适用范围
- 表类型: 表和超级表
- 查询支持: 内层查询和外层查询
- 时间精度: 输入时间戳的精度由所查询表的精度确定,若未指定表,则精度为毫秒
周数计算规则
根据 ISO 8601 标准:
- 每周第一天是周一
- 第一个包含四天及以上的周为第 1 周
- 返回值范围为 1-53
- 年初或年末可能出现跨年的周数情况
基本用法示例
字符串日期格式
-- 基本日期字符串
SELECT WEEKOFYEAR('2024-01-01');
-- 返回: 1 (2024年第1周)SELECT WEEKOFYEAR('2024-12-31');
-- 返回: 1 (2025年第1周,因为该周大部分天数在2025年)SELECT WEEKOFYEAR('2000-01-01');
-- 返回: 52 (1999年第52周,因为该周大部分天数在1999年)-- ISO8601 格式
SELECT WEEKOFYEAR('2024-06-15T10:30:00Z');
-- 返回: 24 (2024年第24周)
时间戳格式
-- TIMESTAMP 类型
SELECT WEEKOFYEAR(TIMESTAMP '2024-01-01 08:00:00');
-- 返回: 1-- BIGINT 时间戳(毫秒)
SELECT WEEKOFYEAR(1704067200000);
-- 返回: 1
NULL 值处理
SELECT WEEKOFYEAR(NULL);
-- 返回: NULL
智能电表场景应用示例
基于智能电表数据库结构:
-- 数据库和表结构
USE test;
-- meters 超级表包含 ts, current, voltage, phase 字段和 location, groupid 标签
场景1:按周统计电力消耗
-- 按周统计每周的用电情况
SELECT WEEKOFYEAR(ts) as week_of_year,COUNT(*) as record_count,AVG(current) as avg_current,MAX(current) as peak_current,MIN(current) as min_current,AVG(voltage) as avg_voltage,location
FROM meters
WHERE ts >= '2024-01-01' AND ts < '2025-01-01'
GROUP BY WEEKOFYEAR(ts), location
ORDER BY week_of_year, location;
场景2:季度用电趋势分析
-- 按季度分析不同周的用电模式
SELECT CASE WHEN WEEKOFYEAR(ts) BETWEEN 1 AND 13 THEN 'Q1'WHEN WEEKOFYEAR(ts) BETWEEN 14 AND 26 THEN 'Q2'WHEN WEEKOFYEAR(ts) BETWEEN 27 AND 39 THEN 'Q3'ELSE 'Q4'END as quarter,WEEKOFYEAR(ts) as week_of_year,location,AVG(current) as avg_current,MAX(voltage) as max_voltage,MIN(voltage) as min_voltage
FROM meters
WHERE ts >= '2024-01-01' AND ts < '2025-01-01'
GROUP BY CASE WHEN WEEKOFYEAR(ts) BETWEEN 1 AND 13 THEN 'Q1'WHEN WEEKOFYEAR(ts) BETWEEN 14 AND 26 THEN 'Q2'WHEN WEEKOFYEAR(ts) BETWEEN 27 AND 39 THEN 'Q3'ELSE 'Q4'END,WEEKOFYEAR(ts), location
ORDER BY quarter, week_of_year, location;
场景3:假期周用电模式识别
-- 识别假期周的用电模式
SELECT WEEKOFYEAR(ts) as week_of_year,location,AVG(current) as avg_current,CASE WHEN WEEKOFYEAR(ts) IN (1, 2) THEN '元旦假期'WHEN WEEKOFYEAR(ts) BETWEEN 6 AND 8 THEN '春节假期'WHEN WEEKOFYEAR(ts) IN (18, 19) THEN '五一假期'WHEN WEEKOFYEAR(ts) IN (40, 41) THEN '国庆假期'ELSE '正常周'END as period_type,COUNT(*) as record_count
FROM meters
WHERE ts >= '2024-01-01' AND ts < '2025-01-01'
GROUP BY WEEKOFYEAR(ts), location
ORDER BY week_of_year, location;
场景4:电网负载分析
-- 分析不同周的负载情况
SELECT WEEKOFYEAR(ts) as week_of_year,COUNT(DISTINCT location) as location_count,AVG(current) as overall_avg_current,MAX(current) as max_current,MIN(current) as min_current
FROM meters
WHERE ts >= '2024-01-01' AND ts < '2025-01-01'
GROUP BY WEEKOFYEAR(ts)
HAVING COUNT(DISTINCT location) >= 2
ORDER BY week_of_year;
场景5:维护计划优化
-- 基于历史周数据制定维护计划
SELECT WEEKOFYEAR(ts) as week_of_year,location,AVG(current) as avg_current,MAX(voltage) - MIN(voltage) as voltage_range,CASE WHEN AVG(current) < 12.0 THEN '最佳维护窗口'WHEN AVG(current) < 14.0 THEN '适合维护'WHEN AVG(current) > 16.0 THEN '避免维护'ELSE '谨慎安排'END as maintenance_recommendation
FROM meters
WHERE ts >= '2024-01-01' AND ts < '2025-01-01'
GROUP BY WEEKOFYEAR(ts), location
HAVING COUNT(*) >= 20
ORDER BY location, avg_current ASC;
场景6:找出用电量异常的周
-- 找出平均用电量超过15A的周
SELECT WEEKOFYEAR(ts) as week_of_year,location,AVG(current) as avg_current,MAX(current) as peak_current,COUNT(*) as record_count
FROM meters
WHERE ts >= '2024-01-01' AND ts < '2025-01-01'
GROUP BY WEEKOFYEAR(ts), location
HAVING AVG(current) > 15.0
ORDER BY avg_current DESC;
场景7:按周进行电压稳定性分析
-- 分析每周的电压稳定性
SELECT WEEKOFYEAR(ts) as week_of_year,location,AVG(voltage) as avg_voltage,MAX(voltage) as max_voltage,MIN(voltage) as min_voltage,CASE WHEN (MAX(voltage) - MIN(voltage)) < 5 THEN '电压稳定'WHEN (MAX(voltage) - MIN(voltage)) < 10 THEN '轻微波动'ELSE '电压不稳定'END as voltage_stability
FROM meters
WHERE ts >= '2024-01-01' AND ts < '2025-01-01'
GROUP BY WEEKOFYEAR(ts), location
HAVING COUNT(*) >= 10
ORDER BY (MAX(voltage) - MIN(voltage)) DESC;
场景8:工作日vs周末的对比分析
-- 结合WEEKDAY函数分析工作日vs周末在不同周的表现
SELECT WEEKOFYEAR(ts) as week_of_year,location,CASE WHEN WEEKDAY(ts) IN (5, 6) THEN '周末'ELSE '工作日'END as day_type,AVG(current) as avg_current,COUNT(*) as record_count
FROM meters
WHERE ts >= '2024-01-01' AND ts < '2025-01-01'
GROUP BY WEEKOFYEAR(ts), location, CASE WHEN WEEKDAY(ts) IN (5, 6) THEN '周末'ELSE '工作日'END
ORDER BY week_of_year, location, day_type;
场景9:特定周数的详细监控
-- 监控特定周数的用电情况
SELECT WEEKOFYEAR(ts) as week_of_year,WEEKDAY(ts) as weekday,CASE WEEKDAY(ts)WHEN 0 THEN '星期一'WHEN 1 THEN '星期二'WHEN 2 THEN '星期三'WHEN 3 THEN '星期四'WHEN 4 THEN '星期五'WHEN 5 THEN '星期六'WHEN 6 THEN '星期日'END as weekday_name,location,AVG(current) as daily_avg_current,MAX(current) as daily_peak_current,COUNT(*) as daily_record_count
FROM meters
WHERE WEEKOFYEAR(ts) = 20
GROUP BY WEEKOFYEAR(ts), WEEKDAY(ts), location
ORDER BY weekday, location;
场景10:周级别的用电趋势分析
-- 分析前10周vs后10周的用电趋势
SELECT CASE WHEN WEEKOFYEAR(ts) <= 10 THEN '年初10周'WHEN WEEKOFYEAR(ts) >= 43 THEN '年末10周'ELSE '其他时期'END as `period`,WEEKOFYEAR(ts) as week_of_year,location,AVG(current) as avg_current,COUNT(*) as record_count
FROM meters
WHERE ts >= '2024-01-01' AND ts < '2025-01-01'AND (WEEKOFYEAR(ts) <= 10 OR WEEKOFYEAR(ts) >= 43)
GROUP BY CASE WHEN WEEKOFYEAR(ts) <= 10 THEN '年初10周'WHEN WEEKOFYEAR(ts) >= 43 THEN '年末10周'ELSE '其他时期'END,WEEKOFYEAR(ts), location
ORDER BY `period`, week_of_year, location;
与 WEEK() 函数的关系
-- WEEKOFYEAR() 等同于 WEEK(expr, 3)
SELECT ts,WEEKOFYEAR(ts) as weekofyear_result,WEEK(ts, 3) as week_mode3_result
FROM meters
WHERE ts >= '2024-01-01' AND ts <= '2024-01-07'
LIMIT 10;
TDengine 中的时间函数
在智能电表场景中,常用的 TDengine 时间函数:
-- 基本时间函数示例
SELECT ts,WEEKOFYEAR(ts) as week, -- 周数(1-53)WEEKDAY(ts) as weekday, -- 星期几(0-6)NOW() as current_time, -- 当前时间TODAY() as today_start -- 今日零时
FROM meters
LIMIT 5;
注意事项
- ISO 8601 标准: 函数采用 ISO 8601 周数计算标准
- 跨年处理: 年初和年末的周数可能属于前一年或后一年
- 时区影响: 函数基于输入时间的字面值计算,不考虑时区转换
- 精度处理: 时间戳精度由查询表的精度设置决定
- TDengine 语法限制:
- 使用简单的聚合函数和 GROUP BY
- 避免复杂的子查询和窗口函数
- 不支持某些标准 SQL 的日期函数
相关函数
- NOW(): 返回当前系统时间戳
- TIMETRUNCATE() 时间截断函数
- TIMEDIFF(): 时间差计算函数
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。