如何在Hive中查询snapshot_date为当前日期减1的所有记录
Hive筛选snapshot_date为前一天数据的实现方案
你可以直接用Hive内置日期函数生成前一天的yyyy-MM-dd格式字符串,和snapshot_date字段做等值匹配即可,具体实现如下:
通用写法(适配绝大多数Hive版本)
SELECT * FROM 替换为你的实际表名 WHERE snapshot_date = date_sub(current_date(), 1);
说明
current_date()会返回当前日期,格式默认为yyyy-MM-dddate_sub(日期, 1)作用是将传入的日期减1天,返回结果同样是yyyy-MM-dd格式的日期类型,和你表中存储的snapshot_date格式完全匹配,可直接比较- 若担心隐式转换带来的兼容问题,可以显式将生成的日期转为string类型:
snapshot_date = cast(date_sub(current_date(), 1) as string)
兼容老版本Hive的写法
如果你的Hive版本较低不支持date_sub函数,可以用时间戳计算的方式实现相同逻辑:
SELECT * FROM 替换为你的实际表名 WHERE snapshot_date = from_unixtime(unix_timestamp() - 86400, 'yyyy-MM-dd');
说明
unix_timestamp()返回当前时间的10位时间戳,减去86400(一天的总秒数)得到前一天同一时间的时间戳from_unixtime(时间戳, 'yyyy-MM-dd')会将时间戳直接转换为你需要的yyyy-MM-dd格式字符串,和字段格式完全匹配
额外优化建议
- 如果
snapshot_date是表的分区字段,以上写法可以命中分区裁剪,不会扫描全表,查询性能更高 - 若需要处理时区偏移问题,可以将
current_date()替换为带时区参数的函数,比如to_date(current_timestamp(), 'Asia/Shanghai')适配东八区时间 - 如果要验证生成的前一天日期是否符合预期,可以先单独执行查询日期的语句:
SELECT date_sub(current_date(), 1);确认返回值符合要求后再执行全表查询
内容的提问来源于stack exchange,提问作者DSSD
相关产品推荐
相关产品推荐

