尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

StarRocks DATE 函数详解:语法、用法与底层实现

StarRocks DATE 函数详解:语法、用法与底层实现 StarRocks DATE 函数详解语法、用法与底层实现【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks本文深入解析 StarRocks 中的DATE()函数如何从DATETIME或DATE表达式中提取日期部分包括完整的 SQL 语法、参数说明、返回值类型、多种实战示例并结合 StarRocks 仓库 的 BEBackend端源码与函数注册表剖析其底层实现原理与类型转换行为帮助你正确、高效地在多维分析、实时报表与按天聚合等场景中使用该函数。函数概述DATE()是 StarRocks 日期时间函数家族中最基础的函数之一它的职责非常单一从给定的日期或日期时间表达式中提取出日期部分。当输入是DATETIME类型例如2017-12-31 11:20:59时它返回对应的DATE类型值例如2017-12-31当输入本身就是DATE类型时则原样返回。该函数常用于将DATETIME时间戳按天归一到DATE粒度配合GROUP BY做按天聚合日活、日报等在 WHERE 条件中把带时间的列转换为日期与CURDATE()、CURRENT_DATE等做当日数据筛选作为DATE_FORMAT()、DATEDIFF()、DATE_ADD()等函数的输入统一数据粒度。语法DATE date(DATETIME|DATE expr)函数名为date大小写不敏感即date()、DATE()、Date()等价参数expr为DATETIME或DATE类型的表达式返回值类型为DATE。注在 StarRocks 中DATE()与TO_DATE()功能一致。从函数注册表gensrc/script/functions.py可以看到二者在 FEFrontend侧被解析为同一个函数签名最终都指向 BE 端同一个实现TimeFunctions::to_date[50050, to_date, ..., DATE, [DATETIME], TimeFunctions::to_date], [50051, date, ..., DATE, [DATETIME], TimeFunctions::to_date],区别仅在于to_date的入参类型在注册表中声明为DATETIME而date额外接受DATE类型输入详见下文“参数说明”。参数说明expr日期或日期时间表达式可以是字面量字符串如2017-12-31 11:20:59或2017-12-31DATE类型列DATETIME类型列返回日期/日期时间的表达式或函数如CURRENT_TIMESTAMP()、NOW()。函数注册表gensrc/script/functions.py 中date条目显示其输入类型为DATETIME但 StarRocks 的类型系统会为调用方自动做兼容处理当实参为DATE时会先完成隐式类型转换cast到DATETIME再进行提取。从源码结构看BE 端为该函数准备了DATETIME - DATE的向量化一元算子模板DEFINE_TIME_UNARY_FN(to_date, TYPE_DATETIME, TYPE_DATE)见 be/src/exprs/time_functions.cpp因此DATE(2017-12-31)这类纯日期输入同样被支持。返回值返回DATE类型值即yyyy-MM-dd格式的日期如果输入为NULL则返回NULL如果输入是无效无法解析的日期或时间则返回NULL。使用示例以下示例均在 StarRocks MySQL 协议兼容的客户端中执行。示例 1从 DATETIME 值提取日期SELECT DATE(2017-12-31 11:20:59); ----------------------------- | date(2017-12-31 11:20:59) | ----------------------------- | 2017-12-31 | ----------------------------- 1 row in set (0.05 sec)可以看到时间部分11:20:59被丢弃仅保留日期2017-12-31。示例 2从 DATE 值提取日期SELECT DATE(2017-12-31); -------------------- | date(2017-12-31) | -------------------- | 2017-12-31 | -------------------- 1 row in set (0.08 sec)输入本身已是DATE函数原样返回。示例 3提取当前时间戳的日期SELECT DATE(current_timestamp()); --------------------------- | date(current_timestamp()) | --------------------------- | 2022-11-08 | --------------------------- 1 row in set (0.05 sec)CURRENT_TIMESTAMP()返回当前日期时间DATE()截取其日期部分输出随执行日期变化。示例 4NULL 与无效输入SELECT DATE(NULL); ------------- | date(NULL) | ------------- | NULL | ------------- SELECT DATE(2017-13-45); -------------------- | date(2017-13-45) | -------------------- | NULL | --------------------非法日期字符串如月份为 13、日期为 45无法解析函数返回NULL符合文档中“输入无效时返回 NULL”的约定。示例 5结合列与聚合做按天统计SELECT DATE(create_time) AS day, COUNT(*) AS cnt FROM orders GROUP BY DATE(create_time) ORDER BY day;将带时间的create_time列归一到天粒度后分组计数是典型的按天聚合场景。相关函数对比函数输入输出用途DATE()DATETIME/DATEDATE提取日期部分本文主角TO_DATE()DATETIMEDATE与DATE()等价见官方文档CURDATE()/CURRENT_DATE无参DATE返回当前日期DATE_FORMAT()DATETIME 格式串VARCHAR按自定义格式输出字符串见官方文档DATE_TRUNC()DATETIME 粒度DATETIME按年/月/日/时等粒度截断见官方文档DATEDIFF()两个日期INT计算日期差见官方文档其中DATE()、DATE_FORMAT()、DATE_TRUNC()、DATEDIFF()等均收录于日期时间函数总览页 date-time-functions.mdx。底层实现原理源码视角1. 函数注册从 FE 到 BEDATE()并非独立于TO_DATE()的新实现而是共享同一份 BE 代码。在 FE 的函数注册表 gensrc/script/functions.py 中date与to_date的注册条目均指向TimeFunctions::to_date并由代码生成工具gensrc/script/gen_functions.py生成对应的 C 入口。因此两个 SQL 函数在 BE 端完全等价。2. 核心实现向量化一元算子BE 端实现位于 be/src/exprs/time_functions.cpp// to_date DEFINE_UNARY_FN_WITH_IMPL(to_dateImpl, v) { return (DateValue)v; } DEFINE_TIME_UNARY_FN(to_date, TYPE_DATETIME, TYPE_DATE);to_dateImpl的核心逻辑仅一步将输入值v强转为DateValue。DateValue是 StarRocks 内部表示日期精确到天的值类型底层基于自 1970-01-01 起的天数存储DEFINE_TIME_UNARY_FN(to_date, TYPE_DATETIME, TYPE_DATE)为该一元函数生成从DATETIME列到DATE列的向量化执行模板。模板中的类型模板参数定义在 be/src/exprs/time_functions.h 中的对应宏体系下配合列式执行引擎按列批量计算避免逐行解释开销由于DATETIME与DATE在存储上都属于“日序数 时分秒”的紧凑编码(DateValue)v这一转换天然会丢弃时间部分从而高效完成日期提取。从DEFINE_TIME_UNARY_FN的命名与使用模式可以推断TimeFunctions中所有同类一元时间函数如YEAR()、MONTH()、DAY()等都走同一套模板化批量执行框架DATE()只是其中“输入 DATETIME、输出 DATE”的一个特例。3. 空值与非法输入的兜底向量化一元算子模板DEFINE_UNARY_FN_WITH_IMPL在生成代码时会统一处理 NULL 传播输入列为 NULL 的行直接输出 NULL不会调用to_dateImpl。而无效日期字符串在表达式解析/类型转换阶段即 FE 解析为常量并 cast 时即被识别为解析失败同样产出 NULL。这与文档“输入为 NULL 或无效时返回 NULL”的说明完全一致。注意事项时区无关DATE()只做字段截断不涉及时区换算跨时区场景请配合CONVERT_TZ()使用。NULL 传染列中存在 NULL 时结果对应行为 NULL业务上可结合COALESCE()/IFNULL()处理默认值。与TO_DATE()完全等价团队编码规范上建议二选一避免混用造成阅读负担。输入类型虽然注册签名接受DATETIME但对DATE字面量同样可用见示例 2如需从字符串按指定格式解析请使用STR_TO_DATE()或TO_DATE()的字符串变体。总结DATE()是 StarRocks 中提取日期部分的最直接手段语法简单、向量化实现高效与TO_DATE()共用底层代码支持DATETIME/DATE输入NULL 与无效输入安全兜底。无论是按天分组聚合、日报统计还是作为其他日期函数的前置归一化步骤它都是数据开发中高频使用的基础函数。更完整的日期时间函数清单可查阅 date-time-functions.mdx。【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表