当前位置: 首页 > news >正文

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;

注意事项

  1. ISO 8601 标准: 函数采用 ISO 8601 周数计算标准
  2. 跨年处理: 年初和年末的周数可能属于前一年或后一年
  3. 时区影响: 函数基于输入时间的字面值计算,不考虑时区转换
  4. 精度处理: 时间戳精度由查询表的精度设置决定
  5. TDengine 语法限制:
    • 使用简单的聚合函数和 GROUP BY
    • 避免复杂的子查询和窗口函数
    • 不支持某些标准 SQL 的日期函数

相关函数

  • NOW(): 返回当前系统时间戳
  • TIMETRUNCATE() 时间截断函数
  • TIMEDIFF(): 时间差计算函数

关于 TDengine

TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

http://www.xdnf.cn/news/1479979.html

相关文章:

  • 【C++框架#3】Etcd 安装使用
  • Blender 3D建模工具学习笔记
  • LeetCode15:三数之和
  • 《MATLAB 批量把振动 CSV(含中文“序号/采样频率”)稳健转成 .mat:自动解析+统一换算+按 H/I/O/F-rpm-fs-load 命名》
  • WIN10+ubuntu22.04.05双系统装机教程
  • 基于STM32F103C8T6的心率与体温监测及报警显示系统设计
  • 如何在 FastAPI 中巧妙覆盖依赖注入并拦截第三方服务调用?
  • vue + ant-design-vue + vuedraggable 实现可视化表单设计器
  • 用 PHP 玩向量数据库:一个从小说网站开始的小尝试
  • 多维度数据统一线性处理的常见方案
  • 鸿蒙libxm2交叉编译
  • (2)桌面云、并行计算、分布式、网格计算
  • LeetCode5最长回文子串
  • 基于Spark的中文文本情感分析系统研究
  • 空间配置器
  • 【STM32HAL-----NRF24L01】
  • leetcode LCR 159 库存管理III
  • Qt网络通信服务端与客户端学习
  • 第5章递归:分治法
  • Qt文字滚动效果学习
  • MySQL 高可用方案之 MHA 架构搭建与实践
  • 常用配置文件
  • 去中心化投票系统开发教程 第三章:智能合约设计与开发
  • [网络入侵AI检测] docs | 任务二分类与多分类
  • 算法题-链表03
  • react native 出现 FATAL EXCEPTION: OkHttp Dispatcher
  • LeetCode 2841.几乎唯一子数组的最大和
  • AI智能体架构全流程全解析
  • [光学原理与应用-432]:非线性光学 - 既然光也是电磁波,为什么不能直接通过电生成特定频率的光波?
  • 打造一款高稳定、低延迟、跨平台RTSP播放器的技术实践