Trino分钟时间序列生成问题:终止时间不符合预期
问题分析与解决方案
问题根源
你的查询中,SEQUENCE(current_date - INTERVAL '4' MONTH, DATE_TRUNC('DAY', LOCALTIMESTAMP) - INTERVAL '1' DAY, INTERVAL '1' HOUR)生成的小时序列包含了目标结束日期(current_date-1天)的00:00这个时间点,之后通过CROSS JOIN UNNEST(SEQUENCE(0,59))给这个小时点叠加了0到59分钟,最终生成了该日期00:00到00:59的所有分钟记录,超出了你预期的终止时间(仅00:00)。
修正方案
有两种简洁的解决方式:
方式一:调整小时序列范围+补充终止时间
先把小时序列的结束时间提前一小时,覆盖到目标结束日期前一天的23:00,结合分钟生成到23:59的记录,再单独添加目标结束日期的00:00:
SELECT dates_m FROM ( -- 生成到结束日期前一天23:59的分钟序列 SELECT DATE_ADD('MINUTE', m, h) AS dates_m FROM UNNEST(SEQUENCE(current_date - INTERVAL '4' MONTH, DATE_TRUNC('DAY', LOCALTIMESTAMP) - INTERVAL '1' DAY - INTERVAL '1' HOUR, INTERVAL '1' HOUR)) AS t(h) CROSS JOIN UNNEST(SEQUENCE(0, 59)) AS t(m) UNION ALL -- 单独添加结束日期的00:00 SELECT DATE_TRUNC('DAY', LOCALTIMESTAMP) - INTERVAL '1' DAY AS dates_m ) AS combined ORDER BY dates_m;
方式二:直接生成分钟级序列(推荐)
Trino的SEQUENCE支持直接以分钟为间隔生成序列,无需拆分小时和分钟,逻辑更清晰且性能更优:
SELECT date_sequence AS dates_m FROM UNNEST(SEQUENCE( current_date - INTERVAL '4' MONTH, DATE_TRUNC('DAY', LOCALTIMESTAMP) - INTERVAL '1' DAY, INTERVAL '1' MINUTE )) AS t(date_sequence) ORDER BY dates_m;
内容的提问来源于stack exchange,提问作者Robbie
相关产品推荐
相关产品推荐

