You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:17:44