Spark Scala如何筛选距今2个月内epoch格式创建时间数据
问题解决方法
首先明确基础判断:从你给出的示例值长度看,creation_date_epoch存储的是13位毫秒级epoch时间戳,不是常见的10位秒级时间戳,这是写过滤条件时首先要对齐的单位,否则查询结果会完全错误。
核心过滤逻辑非常直接:计算出「当前时间往前推2个月的时间点对应的毫秒级时间戳」,只要表中creation_date_epoch字段值大于等于这个阈值,就是符合要求的记录。
各场景具体实现
直接在SQL中计算(推荐)
直接用数据库内置日期函数计算阈值,不需要应用层额外处理,能自动适配不同月份的天数差异,结果最准确。
- MySQL 写法:
SELECT * FROM 你的表名 WHERE creation_date_epoch >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 2 MONTH)) * 1000;
末尾乘1000是因为UNIX_TIMESTAMP()默认返回秒级时间戳,转成毫秒才能和你存储的字段单位对齐。
- PostgreSQL 写法:
SELECT * FROM 你的表名 WHERE creation_date_epoch >= EXTRACT(EPOCH FROM (NOW() - INTERVAL '2 MONTH')) * 1000;
- ClickHouse 写法:
SELECT * FROM 你的表名 WHERE creation_date_epoch >= toUnixTimestamp(now() - INTERVAL 2 MONTH) * 1000;
应用层计算阈值后传入SQL
如果需要在业务代码里先算好阈值再拼SQL,不要直接硬写2个月=60天的固定毫秒值,会因为大小月、闰年出现偏差,要用日期工具类按自然月偏移计算,以Java为例:
// 准确计算2个月前的毫秒级时间戳 long threshold = LocalDateTime.now() .minusMonths(2) .atZone(ZoneId.systemDefault()) .toInstant() .toEpochMilli(); // 把threshold作为参数传入SQL,执行WHERE creation_date_epoch >= ?即可
示例数据验证
假设查询时的当前时间为2022-05-01,计算出的2个月前阈值约为1646064000000(对应2022-03-01 00:00:00),匹配到的符合条件的记录为:
{id: 1234, creation_date_epoch: 1651300805244}{id: 4567, creation_date_epoch: 1651340257517}{id: 5678, creation_date_epoch: 1651348676929}
其余记录的创建时间均早于2个月前的阈值,会被正常过滤。
注意:如果你的字段存的是10位秒级时间戳,所有SQL里乘1000的操作都要去掉,直接用函数返回的秒级时间戳比较即可。
内容的提问来源于stack exchange,提问作者Jericho Sims
相关产品推荐
相关产品推荐

