StarRocks years_diff 函数详解:计算两个日期/时间表达式之间的年份差

发布时间:2026/9/18 20:28:01

StarRocks years_diff 函数详解:计算两个日期/时间表达式之间的年份差 StarRocks years_diff 函数详解计算两个日期/时间表达式之间的年份差【免费下载链接】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 的years_diff日期时间函数展开系统讲解其语法、参数约束、返回值语义与精确到月的取整逻辑。读者读完本文后将掌握在 StarRocks 中使用years_diff计算两时间点年份差的正确写法理解底层实现原理与边界情况如年初未满整年、反向时间差、2 月 29 日等场景并能结合源码定位与测试用例进行验证。函数概述years_diff是 StarRocks 提供的日期时间date-time函数之一用于计算两个日期表达式之间的年份差值结果为expr1 − expr2精确到年。该函数属于 StarRocks 后端BE向量化表达式引擎中的时间函数族声明位于 time_functions.h 第 533 行DEFINE_VECTORIZED_FN(years_diff)其文档位于 years_diff.md。从源码结构看years_diff与months_diff、quarters_diff属于同一族差值函数在 time_functions.h 中与years_diff_v2一并注册注释明确指出years_diff_v2等函数的语义与years_diff保持一致见第 415-419 行。years_diff常用于用户画像分析如统计用户注册至今的年限、账龄分桶、合约期限计算等按整年聚合的业务场景。语法与参数BIGINT years_diff(DATETIME expr1, DATETIME expr2);参数说明expr1结束时间必须是 DATETIME 或 DATE 类型expr2开始时间必须是 DATETIME 或 DATE 类型参数说明要点两个参数均支持DATETIME与DATE类型。当传入DATE时其隐含的时间部分被视为00:00:00如years_diff(2010-11-30, 2000-11-1)等价于比较两个零点时刻。函数计算方向为expr1 − expr2即返回结束时间相对开始时间过去了多少整年。若expr1早于expr2返回负值。返回值类型固定为BIGINT用于承载年份差值可能为负数。返回值语义函数返回BIGINT类型语义为正向差值expr1晚于expr2时返回正数表示满的整年数负向差值expr1早于expr2时返回负数未满一年若expr1与expr2之间的实际间隔不足一个完整年份即月份或日期尚未到达对应位置结果会向零取整truncate toward zero不产生小数部分非法日期如果输入的日期本身不存在例如2022-02-292022 年非闰年函数返回NULL。使用示例带时间部分的 DATETIME 参数select years_diff(2010-11-30 23:59:59, 2000-11-1 23:59:59); --------------------------------------------------------- | years_diff(2010-11-30 23:59:59, 2000-11-1 23:59:59) | --------------------------------------------------------- | 10 | ---------------------------------------------------------仅日期部分的 DATE 参数select years_diff(2010-11-30, 2000-11-1); --------------------------------------- | years_diff(2010-11-30, 2000-11-1) | --------------------------------------- | 10 | ---------------------------------------边界与反向差值的直观验证结合源码实现可以推演出以下典型边界结果读者可直接在 StarRocks 中执行验证查询预期结果说明years_diff(2021-01-01, 2021-03-02)0同一年内不足一整年取整为 0years_diff(2021-03-02, 2021-01-01)0反向仍不足一年years_diff(2021-12-31, 2021-01-01)0同年内即使跨 11 个月仍为 0years_diff(2023-01-01, 2021-03-02)1跨年但未满两年取整为 1years_diff(2021-03-02, 2023-01-01)-1反向差值返回负数底层实现原理源码级分析years_diff的核心实现位于 time_functions.cpp 的years_diffImpl第 1211-1233 行并通过DEFINE_TIME_BINARY_FN(years_diff, TYPE_DATETIME, TYPE_DATETIME, TYPE_BIGINT)第 1235 行注册为接收两个DATETIME、返回BIGINT的二元向量化函数。其计算逻辑可分解为三步拆解时间分量调用TimestampValue::to_timestamp将左右操作数分别拆解为年、月、日、时、分、秒、微秒year1/2、month1/2、day1/2、hour1/2等。计算年份粗差值year year1 - year2得到仅按年份相减的初始结果。按月-日-时-分-秒-微秒字典序修正取整构造一个单调编码函数func(month, day, hour, minute, second, usec)将年内的时刻整体编码为一个大整数当year 0时若结束时刻的年内编码小于开始时刻的年内编码说明结束时间在年内尚未到达开始时间的对应位置即未满整年则year减 1当year 0时做对称处理若结束时刻的年内编码大于开始时刻则year加 1。这一修正即实现了向零取整、不足一年不计的语义。// be/src/exprs/time_functions.cpp 第 1211-1233 行核心逻辑摘录 DEFINE_BINARY_FUNCTION_WITH_IMPL(years_diffImpl, l, r) { int year1, month1, day1, hour1, minute1, second1, usec1; int year2, month2, day2, hour2, minute2, second2, usec2; l.to_timestamp(year1, month1, day1, hour1, minute1, second1, usec1); r.to_timestamp(year2, month2, day2, hour2, minute2, second2, usec2); int year (year1 - year2); // 将月/日/时/分/秒/微秒编码为大整数用于未满整年的字典序比较 const auto func [](int month, int day, int hour, int minute, int second, int usec) - int64_t { ... }; if (year 0) { year - (func(month1, day1, hour1, minute1, second1, usec1) func(month2, day2, hour2, minute2, second2, usec2)); } else if (year 0) { year (func(month1, day1, hour1, minute1, second1, usec1) func(month2, day2, hour2, minute2, second2, usec2)); } return year; }需要说明的是上述实现按年份差 年内时刻比较完成整年取整未对月份天数差异如平年 2 月 28 日与闰年 2 月 29 日做逐月逐日的特殊处理更精细的月末对齐语义由years_diff_v2第 1238-1291 行承担其内部使用DAYS_IN_MONTH数组结合闰年判断对 2 月在平年/闰年的天数差异进行了大量边界分支处理见第 1255-1286 行注释中的date_diff(year, 2017-02-28, 2016-02-29)等特殊场景。当前仓库中years_diff_v2的注册与years_diff并存见 time_functions.h 第 415-419 行读者若需要对齐月末的年份差语义可关注该变体。单元测试验证StarRocks 为years_diff提供了专项单元测试TimeFunctionsTest.yearsDiffTest位于 time_functions_test.cpp 第 751-854 行覆盖了以下关键场景未满整年返回 02001-11-01 00:30:30与2000-12-01 00:30:30相差不足一年断言结果为0正向整年差2002-12-01与2000-11-01相差两年有余断言结果为2反向差值为负2000-11-01与2001-12-01前者早于后者断言结果为-1同年时间对2021-01-01与2021-03-02、2021-01-01与2021-12-31等成对输入均断言为0且注释明确timestamps that share a year are less than one year apart in either direction同一自然年内的两个时间点无论方向差均不足一年跨年部分年份向零取整2023-01-01与2021-03-02断言为1反向断言为-1。测试通过TimestampValue::create构造时间值、以TimestampColumn组织列数据直接调用TimeFunctions::years_diff向量化入口并以ColumnHelper::cast_toTYPE_BIGINT校验结果从执行层印证了本文上述语义描述。实践注意事项参数顺序决定正负函数语义是expr1 − expr2统计距今多少整年时应写成years_diff(now(), 起始时间)统计距今负数未来时间同理。DATE 与 DATETIME 混用DATE参数会按00:00:00参与比较混用不会报错但精确到秒的边界判断如23:59:59仅在DATETIME下有意义。非法日期返回 NULL如2022-02-29平年无此日函数返回NULL需在业务侧做好空值处理。与同类函数的选型同一差值函数族还包括months_diff、quarters_diff以及语义对齐月尾的years_diff_v2按月、按季度粒度计算时请选用对应函数避免自行做乘法换算造成语义偏差。整年取整特性结果不会出现小数或四舍五入任何不满一年的间隔一律截断为零这与datediff按天数取整、timediff返回精确时长的语义均不同按需选用。如需查看更多日期时间函数的完整清单与语法说明可继续浏览 docs/en/sql-reference/sql-functions/date-time-functions 目录下的对应文档。【免费下载链接】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),仅供参考
延伸阅读

更多相关文章

2026/9/18 20:28:01

STM32F407统一实测8款RTOS:上下文切换与中断延迟

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 21:23:03

多模态长期记忆Agent接模型,TaoToken 替换 Key 即可

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 21:23:03

C语言函数库手册PDF:man/groff导出与索引实践

简介:C语言函数库手册以PDF形式整理,面向正在学习或使用C语言做软件开发的学生、初学者与需随时查阅的工程师,用于解决函数名、参数及返回值记忆模糊、标准库分类不清晰的问题。全包仅1个PDF文件,约51KB,体积轻便&…

2026/9/18 21:23:03

教案结构化:用Python自动化生成家畜饲养学教案表格

简介:家畜饲养学教学教案文档(.doc)专为畜牧兽医专业师生设计,系统整理了家畜饲养学课程的核心教学框架。内容以绪论为起点,明确学习任务与研究方法,随后逐章展开畜禽营养原理,涉及植物性饲料与…

2026/9/18 21:23:03

算法题总结274:从题解到可复用模式库的整理方法

简介:这是一份面向技术面试和高频算法考察的总结性资料,整合了《剑指 offer》、LeetCode、LintCode 等主流题源中的典型问题,适合有基础、正在准备校招或跳槽的开发者集中突破。资源仅打包为 1 个 PDF 文件,大小 3.36MB&#xff0…

2026/9/18 21:18:03

Verilog不是编程而是画电路:FPGA硬件设计入门指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 14:13:01

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/18 14:13:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/18 14:13:02

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/18 14:13:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码