Redshift中最近7天Unix时间戳过滤逻辑失效问题排查
问题分析与解决方案
哈哈,Redshift的时间函数确实有时候容易踩坑,我来帮你捋捋问题出在哪~
你的逻辑核心错误:单位不匹配
你遇到的问题根源在于时间戳单位不一致:
- 你的
tb_h是毫秒级UNIX时间戳(比如1690867200000代表2023-08-01 00:00:00) - 而
DATE_PART(epoch, ...)返回的是秒级UNIX时间戳(同样的时间会返回1690867200)
当你用tb_h >= 秒级时间戳做比较时,所有毫秒级的时间戳数值都远大于秒级的数值,这个条件永远为真,自然会返回所有数据。
另外,你的日期计算逻辑也有点冗余:DATEADD(milliseconds, -604800000, DATEADD(day, -1, trunc(getdate()))) 相当于先取昨天零点,再往前推7天,最终得到的是8天前的零点,这和你要的“最近7天”需求也不匹配。
两种正确的解决方案
根据你的需求(筛选最近7天的数据),这里提供两种直观的写法:
方案1:把tb_h转换为日期类型比较(更易读)
利用Redshift的to_timestamp函数,将毫秒级时间戳转成标准TIMESTAMP后再比较:
SELECT * FROM your_table WHERE to_timestamp(tb_h / 1000) >= DATEADD(day, -7, trunc(getdate()))
tb_h / 1000:把毫秒转成秒级,适配to_timestamp的参数要求DATEADD(day, -7, trunc(getdate())):获取7天前的零点时间,确保筛选出从那天零点到现在的所有数据
方案2:把目标时间转成毫秒级时间戳比较(保持单位一致)
如果想直接用数值比较,把7天前的时间转成毫秒级UNIX时间戳即可:
SELECT * FROM your_table WHERE tb_h >= DATE_PART(epoch, DATEADD(day, -7, trunc(getdate()))) * 1000
DATE_PART(epoch, ...)得到秒级时间戳,乘以1000转成毫秒,和tb_h单位完全一致,比较逻辑就正确了
内容的提问来源于stack exchange,提问作者dataflux
相关产品推荐
相关产品推荐

