TDengine 时间函数 WEEKDAY() 用户手册
WEEKDAY() 函数用户手册
函数定义
WEEKDAY(expr)
功能说明
WEEKDAY()
函数返回输入日期是星期几,用数字表示,其中 0 代表星期一,1 代表星期二,以此类推,6 代表星期日。
版本要求
- 最低版本: v3.3.3.0
返回值
- 数据类型: BIGINT
- 取值范围: 0-6(0=星期一,1=星期二,2=星期三,3=星期四,4=星期五,5=星期六,6=星期日)
- 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' |
适用范围
- 表类型: 表和超级表
- 查询支持: 内层查询和外层查询
- 时间精度: 输入时间戳的精度由所查询表的精度确定,若未指定表,则精度为毫秒
基本用法示例
字符串日期格式
-- 基本日期字符串
SELECT WEEKDAY('2024-01-01');
-- 返回: 0 (星期一)SELECT WEEKDAY('2024-01-06');
-- 返回: 5 (星期六)SELECT WEEKDAY('2024-01-07');
-- 返回: 6 (星期日)-- ISO8601 格式
SELECT WEEKDAY('2024-03-15T10:30:00Z');
-- 返回: 4 (星期五)
时间戳格式
-- TIMESTAMP 类型
SELECT WEEKDAY(TIMESTAMP '2024-01-01 08:00:00');
-- 返回: 0 (星期一)-- BIGINT 时间戳(毫秒)
SELECT WEEKDAY(1704067200000);
-- 返回: 0 (星期一)
NULL 值处理
SELECT WEEKDAY(NULL);
-- 返回: NULL
智能电表场景应用示例
假设我们有一个智能电表数据库,包含以下结构:
-- 创建数据库
CREATE DATABASE test;
USE test;-- 创建智能电表超级表
CREATE STABLE meters (ts TIMESTAMP,current FLOAT,voltage INT,phase FLOAT
) TAGS (location VARCHAR(64),groupid INT
);-- 创建子表
CREATE TABLE d1001 USING meters TAGS ('California.SanFrancisco', 2);
CREATE TABLE d1002 USING meters TAGS ('California.LosAngeles', 2);
CREATE TABLE d1003 USING meters TAGS ('California.SanDiego', 3);-- 插入示例数据(一周的数据)
INSERT INTO d1001 VALUES
('2024-01-01 08:00:00', 12.30, 221, 0.31), -- 星期一
('2024-01-02 08:00:00', 12.50, 223, 0.32), -- 星期二
('2024-01-03 08:00:00', 13.10, 219, 0.33), -- 星期三
('2024-01-04 08:00:00', 12.80, 225, 0.35), -- 星期四
('2024-01-05 08:00:00', 14.20, 227, 0.38), -- 星期五
('2024-01-06 10:00:00', 15.50, 230, 0.42), -- 星期六
('2024-01-07 10:00:00', 16.10, 232, 0.45); -- 星期日INSERT INTO d1002 VALUES
('2024-01-01 09:00:00', 11.80, 220, 0.28),
('2024-01-02 09:00:00', 12.20, 222, 0.29),
('2024-01-03 09:00:00', 12.70, 218, 0.30),
('2024-01-04 09:00:00', 13.30, 224, 0.32),
('2024-01-05 09:00:00', 14.80, 226, 0.36),
('2024-01-06 11:00:00', 16.20, 229, 0.40),
('2024-01-07 11:00:00', 17.50, 231, 0.43);
场景1:电力消耗模式分析 - 工作日vs周末
-- 分析不同星期的电力消耗模式
SELECT WEEKDAY(ts) as weekday_num,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,COUNT(*) as record_count,AVG(current) as avg_current,MAX(current) as peak_current,AVG(voltage) as avg_voltage,AVG(phase) as avg_phase
FROM meters
WHERE ts >= '2024-01-01' AND ts < '2024-01-08'
GROUP BY WEEKDAY(ts)
ORDER BY weekday_num;
场景2:工作日与周末用电对比
-- 对比工作日和周末的用电情况
SELECT CASE WHEN WEEKDAY(ts) IN (5, 6) THEN '周末'ELSE '工作日'END as day_type,location,COUNT(*) as record_count,AVG(current) as avg_current,MAX(current) as peak_current,MIN(current) as min_current,STDDEV(current) as current_stddev
FROM meters
WHERE ts >= '2024-01-01' AND ts < '2024-01-08'
GROUP BY CASE WHEN WEEKDAY(ts) IN (5, 6) THEN '周末'ELSE '工作日'END, location
ORDER BY location, day_type;
场景3:特定星期的异常监控
-- 监控星期五的用电异常(电流超过14A)
SELECT tbname,ts,current,voltage,phase,location
FROM meters
WHERE WEEKDAY(ts) = 4 -- 星期五AND current > 14.0AND ts >= '2024-01-01' AND ts < '2024-02-01'
ORDER BY current DESC;
场景4:周末高峰用电分析
-- 分析周末(星期六、日)的高峰用电时段
SELECT WEEKDAY(ts) as weekday_num,CASE WEEKDAY(ts)WHEN 5 THEN '星期六'WHEN 6 THEN '星期日'END as weekend_day,HOUR(ts) as hour_of_day,location,AVG(current) as avg_current,MAX(current) as peak_current,COUNT(*) as sample_count
FROM meters
WHERE WEEKDAY(ts) IN (5, 6) -- 只看周末AND ts >= '2024-01-01' AND ts < '2024-02-01'
GROUP BY WEEKDAY(ts), HOUR(ts), location
HAVING AVG(current) > 15.0 -- 平均电流超过15A的时段
ORDER BY location, weekday_num, hour_of_day;
场景5:星期模式的用电趋势
-- 计算每个星期几的用电趋势和稳定性
SELECT WEEKDAY(ts) as weekday_num,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,groupid,COUNT(*) as total_records,AVG(current) as avg_current,STDDEV(current) as current_variation,AVG(voltage) as avg_voltage,STDDEV(voltage) as voltage_variation,-- 计算变异系数(标准差/平均值)来衡量稳定性ROUND(STDDEV(current) / AVG(current) * 100, 2) as current_cv_percent
FROM meters
WHERE ts >= '2024-01-01' AND ts < '2024-02-01'
GROUP BY WEEKDAY(ts), groupid
ORDER BY groupid, weekday_num;
场景6:工作日负载预测基础数据
-- 为负载预测提供工作日基础数据
SELECT WEEKDAY(ts) as weekday_num,HOUR(ts) as hour_of_day,location,AVG(current) as avg_hourly_current,MIN(current) as min_hourly_current,MAX(current) as max_hourly_current,COUNT(*) as sample_count
FROM meters
WHERE WEEKDAY(ts) NOT IN (5, 6) -- 排除周末AND ts >= '2024-01-01' AND ts < '2024-02-01'
GROUP BY WEEKDAY(ts), HOUR(ts), location
HAVING COUNT(*) >= 3 -- 确保有足够的样本
ORDER BY location, weekday_num, hour_of_day;
场景7:电表维护计划 - 避开高峰日
-- 识别低负载的星期几,用于安排维护计划
SELECT WEEKDAY(ts) as weekday_num,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,AVG(current) as avg_load,MAX(current) as peak_load,CASE WHEN AVG(current) < 13.0 THEN '低负载日-适合维护'WHEN AVG(current) BETWEEN 13.0 AND 15.0 THEN '中等负载日'ELSE '高负载日-避免维护'END as maintenance_recommendation
FROM meters
WHERE ts >= '2024-01-01' AND ts < '2024-02-01'
GROUP BY WEEKDAY(ts)
ORDER BY avg_load ASC;
注意事项
- 星期计算标准:
WEEKDAY()
函数采用 ISO 8601 标准,0 代表星期一,与某些数据库系统可能不同 - 时区影响: 函数基于输入时间的字面值计算,不考虑时区转换
- 精度处理: 时间戳精度由查询表的精度设置决定
- 性能考虑: 在大数据量查询中,可以考虑对
WEEKDAY(ts)
的结果创建索引以提高查询性能
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。