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

资讯详情

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

StarRocks time_to_sec 函数详解:将 TIME 值转换为秒数的用法、示例与底层实现

StarRocks time_to_sec 函数详解:将 TIME 值转换为秒数的用法、示例与底层实现 StarRocks time_to_sec 函数详解将 TIME 值转换为秒数的用法、示例与底层实现【免费下载链接】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/starrockstime_to_sec是 StarRocks 日期时间函数族中的一个基础转换函数用于把 TIME 类型的时间值换算为自当日零点起累计的秒数BIGINT。本文以 time_to_sec 官方文档 为主体结合 FE 函数注册与 BE 向量化实现源码完整讲解其语法、参数、返回值、实战示例与底层原理帮助你准确地在查询、报表与实时分析场景中使用时间换算。函数概述time_to_sec将一个 TIME 时间值转换为数字秒数转换公式为Hour × 3600 Minute × 60 Second即把时间中的小时、分钟、秒按六十进制加权累加得到从00:00:00起经过的总秒数。例如12:13:14会被换算为12 × 3600 13 × 60 14 43994秒。该函数通常用于时间差值计算、秒级粒度的排序与聚合、以及与以秒为单位的业务指标如响应耗时、会话时长进行对齐等场景。语法BIGINT time_to_sec(TIME time)参数说明参数说明time待转换的时间值必须为 TIME 类型。在实际书写 SQL 时可以直接传入字符串字面量如12:13:14StarRocks 会将其隐式解析为 TIME 值参与计算。返回值说明返回 BIGINT 类型的秒数值如果输入值格式非法无法解析为合法时间返回 NULL如果输入为 NULL结果同样为 NULLNULL 在表达式求值中正常传播。示例官方文档给出的基础示例select time_to_sec(12:13:14); ----------------------------- | time_to_sec(12:13:14) | ----------------------------- | 43994| -----------------------------按上述转换公式还可以推导出以下典型取值输入换算过程结果秒00:00:000×3600 0×60 0000:00:010×3600 0×60 1112:00:0012×36004320023:59:5923×3600 59×60 5986399结合表列使用time_to_sec是严格一元函数可直接作用于表中的 TIME 列例如按时间换算后的秒数进行过滤或排序-- 筛选出当日累计秒数大于 43200即 12:00:00 之后的记录 SELECT user_id, order_time, time_to_sec(order_time) AS seconds FROM user_orders WHERE time_to_sec(order_time) 43200 ORDER BY seconds;与 sec_to_time 互逆转换time_to_sec的逆函数是sec_to_time将秒数还原为 TIME 值对应常量定义见 FunctionSet.java。两者配合可用于「TIME ↔ 秒数」的双向换算例如在报表中展示秒级耗时后又还原为易读的时间格式。源码实现剖析BE 端向量化一元函数的极简实现在存储与计算引擎BE中time_to_sec的实现位于 time_functions.cppDEFINE_UNARY_FN_WITH_IMPL(time_to_secImpl, v) { return static_castint64_t(v); } DEFINE_TIME_UNARY_FN(time_to_sec, TYPE_TIME, TYPE_BIGINT);从源码可以看到三个关键点核心逻辑是类型强转TIME 值在 StarRocks 内部以数值形式存储static_castint64_t(v)直接将其转换为整数秒这与文档所述公式小时×3600 分钟×60 秒在数值表示上等价严格的类型约束通过DEFINE_TIME_UNARY_FN(time_to_sec, TYPE_TIME, TYPE_BIGINT)宏注册明确限定入参类型为TYPE_TIME、返回类型为TYPE_BIGINT非法输入在类型解析/值校验阶段即被拒绝并产生 NULL走向量化执行路径该宏展开后调用VectorizedStrictUnaryFunctiontime_to_secImpl::evaluateTYPE_TIME, TYPE_BIGINT宏定义见 time_functions.cpp在列式批处理中按列整体求值天然支持 NULL 传播与常量折叠性能开销极小。同时函数声明注册在 time_functions.hDEFINE_VECTORIZED_FN(time_to_sec)与sec_to_time相邻属于同一批日期时间向量化函数。FE 端函数名常量与优化器统计在前端FE中函数名以常量形式定义于 FunctionSet.javapublic static final String TIME_TO_SEC time_to_sec;此外在 ExpressionStatisticsCalculatorTest.java 中也能看到该函数参与表达式统计信息计算的测试覆盖说明它被优化器视为常规确定性标量函数处理不属于nonDeterministicTimeFunctions集合见 FunctionSet.java可以安全地参与常量折叠、谓词下推与查询缓存优化。使用注意事项输入必须可解析为合法时间传入非法格式如越界的小时/分钟/秒时函数返回 NULL建议在数据清洗阶段提前处理脏数据返回值为 BIGINT秒数可能较大当日最大约 86399但在 BIGINT 范围内完全无溢出风险可直接参与加减乘除运算NULL 语义与大多数 StarRocks 标量函数一致任一输入为 NULL 则结果为 NULL逆函数范围限制作为对称功能sec_to_time在 time_functions.cpp 中对输入秒数做了±3023999的钳制对应约 839 小时 59 分 59 秒当秒数超出该范围时会被截断到边界值涉及大数值反向换算时需要留意。关联阅读官方函数参考time_to_sec、中文版文档BE 实现time_functions.cpp、time_functions.hFE 注册FunctionSet.java如需进一步探索同族函数如sec_to_time、hour、minute、second可在docs/en/sql-reference/sql-functions/date-time-functions/目录与 time_functions.cpp 中查阅对应文档与实现。【免费下载链接】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),仅供参考
返回列表