26ai新特性实战:DATEDIFF函数
胖头鱼的技术专栏-449 26ai新特性实战:DATEDIFF函数(20260720)
作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database
PostgreSQL ACE10年+数据库行业经验
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP,ITPUB认证专家
圈内拥有“总监”称号,非著名社恐(社交恐怖分子)全网同名:胖头鱼的鱼缸
ITPUB:yhw1809
除授权转载并标明出处外,均为“非法”抄袭
前面针对Oracle AI Database 23.26.2中便于本地演示的新特性已经完成了,接下来将使用若干期演示23.26.1的新特性。
特性介绍
Oracle AI Database 23.26.1引入了DATEDIFF函数,用于计算两个日期之间的差异。该函数返回两个DATE或TIMESTAMP值之间按指定单位(天、月、年等)计算的数量差。
语法介绍
DATEDIFF(unit, date1, date2)
支持的日期单位(unit):
DAY - 按天计算差异,返回两个日期之间的天数 MONTH - 按月计算差异,返回两个日期之间的月数差 YEAR - 按年计算差异,返回两个日期之间的年数差
参数说明:
unit:日期单位,可用单引号字符串指定,如 ‘DAY’、‘MONTH’、‘YEAR’ date1:第一个日期(被减数),可以是DATE或TIMESTAMP类型 date2:第二个日期(减数),可以是DATE或TIMESTAMP类型 结果 = date1 - date2,按照指定单位计算
行为细节:
DAY模式下计算精确的天数差(小数点后包含时分秒差异) MONTH模式下按月份计算,不完整月份按比例折算 YEAR模式下按年份计算,不完整年份按比例折算 支持DATE和TIMESTAMP类型 当使用TIMESTAMP类型时,计算结果更精确
使用限制
unit 参数必须是有效的日期单位(DAY/MONTH/YEAR) date1 和 date2 必须是有效的日期或时间戳类型 不支持时区时间戳(TIMESTAMP WITH TIME ZONE)
适用场景
报表分析:计算订单处理时间、项目工期等 年龄计算:根据出生日期计算精确年龄 财务分析:计算投资持有天数、贷款月数等 数据质量检查:验证日期范围内的数据分布 销售分析:比较不同产品的最早和最晚销售日期之间的时间跨度 日志分析:计算事件之间的时间间隔
实战演示
同之前一样,使用用户NFTEST,已授权DB_DEVELOPER_ROLE角色,测试操作均在NFTEST用户下执行。
创建测试表并添加测试数据
CREATE TABLE nwc_sales (
sale_id NUMBER PRIMARY KEY,
product VARCHAR2(30),
region VARCHAR2(30),
amount NUMBER,
sale_date DATE
);INSERT INTO nwc_sales VALUES (1, 'Widget', 'East', 100, DATE'2026-01-15');
INSERT INTO nwc_sales VALUES (2, 'Widget', 'West', 150, DATE'2026-01-20');
INSERT INTO nwc_sales VALUES (3, 'Gadget', 'East', 200, DATE'2026-02-10');
INSERT INTO nwc_sales VALUES (4, 'Gadget', 'West', 120, DATE'2026-02-15');
INSERT INTO nwc_sales VALUES (5, 'Widget', 'East', 80, DATE'2026-03-01');
INSERT INTO nwc_sales VALUES (6, 'Gadget', 'West', 300, DATE'2026-03-05');COMMIT;
测试1:日的DATEDIFF
SELECT
sale_id, product, region, sale_date,
DATEDIFF(DAY, SYSDATE, sale_date) AS days_since_sale
FROM nwc_sales
ORDER BY sale_id;
测试2:月的DATEDIFF
SELECT
sale_id, product, region, sale_date,
DATEDIFF(MONTH, sale_date, DATE'2026-03-05') AS months_to_mar5
FROM nwc_sales
ORDER BY sale_id;
测试3:年的DATEDIFF
SELECT
sale_id, product, region, sale_date,
DATEDIFF(YEAR, sale_date, DATE'2027-01-01') AS years_to_2027
FROM nwc_sales
ORDER BY sale_id;
测试4:TIMESTAMP值的DATEDIFF
SELECT
DATEDIFF(DAY,
TIMESTAMP'2026-01-15 08:30:00',
TIMESTAMP'2026-01-15 20:45:00') AS partial_day_diff,
DATEDIFF(DAY,
TIMESTAMP'2026-01-15 00:00:00',
TIMESTAMP'2026-02-15 00:00:00') AS full_month_days,
DATEDIFF(MONTH,
TIMESTAMP'2026-01-15 00:00:00',
TIMESTAMP'2026-06-15 00:00:00') AS month_diff
FROM dual;
测试5:基于每个产品使用DATEDIFF
WITH product_dates AS (
SELECT
product,
MIN(sale_date) AS earliest_sale,
MAX(sale_date) AS latest_sale
FROM nwc_sales
GROUPBY product
)
SELECT
product,
earliest_sale,
latest_sale,
DATEDIFF(DAY, latest_sale, earliest_sale) AS day_span,
DATEDIFF(MONTH, latest_sale, earliest_sale) AS month_span,
DATEDIFF(YEAR, latest_sale, earliest_sale) AS year_span
FROM product_dates
ORDER BY product;
测试6:在WHERE子句中使用DATEDIFF
SELECT sale_id, product, sale_date,
DATEDIFF(DAY, sale_date, DATE'2026-03-01') AS days_before_mar1
FROM nwc_sales
WHERE DATEDIFF(DAY, sale_date, DATE'2026-03-01') <= 30
ORDER BY sale_date;
总结
本期对Oracle AI Database 26ai,23.26.1版本新引入的DATEDIFF函数新特性进行了完整介绍与实战演示,这是一个在时间上非常实用的开发增强。
老规矩,知道写了些啥。