DB2中如何从指定日期的特定时间点起查询未来24小时的全量数据?
解决DB2中跨天时间区间的查询问题
首先,咱们来分析下你原来的SQL为什么不满足需求:你的语句用了Date BETWEEN 1191231 AND 1200101 AND time > 16500,这会错误地过滤掉2020-01-01当天早于16500秒的记录,同时也没有区分不同日期的时间条件——你需要的是2019-12-31当天16200秒及以后,加上2020-01-01当天16200秒及以前的记录,而不是统一要求时间大于16500秒。
下面给你两种可行的解决方案,你可以根据实际场景选择:
方案一:转换为时间戳进行比较(直观易读)
把数值型的Date和秒数Time组合成DB2的TIMESTAMP类型,然后直接和目标时间区间比较,这种方式逻辑清晰,适合日期范围较大的场景:
SELECT Date, Time, Account, Amount FROM Customer WHERE Account = '24562' AND TIMESTAMP( -- 将数值日期转换为DATE类型:1191231 → '1191231' → 2019-12-31 DATE(CHAR(Date)), -- 将秒数转换为TIME类型:比如16253秒 → 04:30:53 TIME('00:00:00') + SECONDS(Time) ) BETWEEN TIMESTAMP('2019-12-31 04:30:00') AND TIMESTAMP('2020-01-01 04:30:00');
方案二:直接数值条件判断(性能更优)
如果你的数据量较大,推荐这种方式——不需要转换函数,直接通过数值比较过滤,能更好地利用索引:
SELECT Date, Time, Account, Amount FROM Customer WHERE Account = '24562' AND ( -- 2019-12-31当天,时间≥16200秒(04:30) (Date = 1191231 AND Time >= 16200) -- 2020-01-01当天,时间≤16200秒(04:30) OR (Date = 1200101 AND Time <= 16200) -- 如果有中间日期(通用场景可扩展):OR (Date BETWEEN 1191232 AND 1200100) );
这两种方案都会返回你期望的结果:
Date(Numeric) Time(Seconds) Account Amount 1191231 16253 24562 7600 1200101 15253 24562 2500
内容的提问来源于stack exchange,提问作者Mohammad Areeb
相关产品推荐
相关产品推荐

