TDengine 时间函数 WEEKDAY() 用户手册

WEEKDAY() 函数用户手册

函数定义

sql 复制代码
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'

适用范围

  • 表类型: 表和超级表
  • 查询支持: 内层查询和外层查询
  • 时间精度: 输入时间戳的精度由所查询表的精度确定,若未指定表,则精度为毫秒

基本用法示例

字符串日期格式

sql 复制代码
-- 基本日期字符串
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 (星期五)

时间戳格式

sql 复制代码
-- TIMESTAMP 类型
SELECT WEEKDAY(TIMESTAMP '2024-01-01 08:00:00');
-- 返回: 0 (星期一)

-- BIGINT 时间戳(毫秒)
SELECT WEEKDAY(1704067200000);
-- 返回: 0 (星期一)

NULL 值处理

sql 复制代码
SELECT WEEKDAY(NULL);
-- 返回: NULL

智能电表场景应用示例

假设我们有一个智能电表数据库,包含以下结构:

sql 复制代码
-- 创建数据库
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周末

sql 复制代码
-- 分析不同星期的电力消耗模式
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:工作日与周末用电对比

sql 复制代码
-- 对比工作日和周末的用电情况
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:特定星期的异常监控

sql 复制代码
-- 监控星期五的用电异常(电流超过14A)
SELECT 
    tbname,
    ts,
    current,
    voltage,
    phase,
    location
FROM meters 
WHERE WEEKDAY(ts) = 4  -- 星期五
    AND current > 14.0
    AND ts >= '2024-01-01' AND ts < '2024-02-01'
ORDER BY current DESC;

场景4:周末高峰用电分析

sql 复制代码
-- 分析周末(星期六、日)的高峰用电时段
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:星期模式的用电趋势

sql 复制代码
-- 计算每个星期几的用电趋势和稳定性
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:工作日负载预测基础数据

sql 复制代码
-- 为负载预测提供工作日基础数据
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:电表维护计划 - 避开高峰日

sql 复制代码
-- 识别低负载的星期几,用于安排维护计划
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;

注意事项

  1. 星期计算标准 : WEEKDAY() 函数采用 ISO 8601 标准,0 代表星期一,与某些数据库系统可能不同
  2. 时区影响: 函数基于输入时间的字面值计算,不考虑时区转换
  3. 精度处理: 时间戳精度由查询表的精度设置决定
  4. 性能考虑 : 在大数据量查询中,可以考虑对 WEEKDAY(ts) 的结果创建索引以提高查询性能

关于 TDengine

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

相关推荐
TDengine (老段)3 小时前
从 ETL 到 Agentic AI:工业数据管理变革与 TDengine IDMP 的治理之道
数据库·数据仓库·人工智能·物联网·时序数据库·etl·tdengine
LQ深蹲不写BUG5 小时前
MySql的事务机制
数据库·mysql
LQ深蹲不写BUG5 小时前
ElasticSearch 基础内容深度解析
大数据·elasticsearch·搜索引擎
逼子格6 小时前
【Proteus仿真】定时器控制系列仿真——秒表计数/数码管显示时间
数据库·单片机·嵌入式硬件·51单片机·proteus·定时器·硬件工程师
stein_java7 小时前
Mybatis-7 XML映射器
数据库·sql·mybatis
xhbh6667 小时前
开发效率翻倍:资深DBA都在用的MySQL客户端利器
数据库·mysql·数据库连接工具·mysql 连接工具
Debug_Snail8 小时前
【营销策略算法】关联规则学习-购物篮分析
大数据·人工智能
LJC_Superman8 小时前
Web与Nginx网站服务
运维·服务器·前端·网络·数据库·nginx·vim