Redshift中查询UNIX时间戳列指定日期范围数据报错如何解决
问题原因
- 核心报错根源是字段类型不匹配:
impression_time是UNIX时间戳格式,本质为整数类型(存储1970-01-01到对应时间的秒数),你直接在WHERE条件中将整数和'2021-09-01'这类字符串格式的日期对比,会触发类型校验错误。 - 额外逻辑隐患:SELECT中给转换后的日期设置的别名和原字段重名,后续容易引发逻辑混淆,建议修改别名。
最优解法
写法1(推荐,性能最优)
将筛选日期转换为UNIX时间戳和原字段比对,不需要对表中每行数据做转换,可利用字段索引:
SELECT split_part((timestamp '1970-01-01'::date + impression_time * interval '1 second'), ' ', 1) AS impression_date FROM impression_db WHERE impression_time >= EXTRACT(EPOCH FROM '2021-09-01'::timestamp)::INT AND impression_time < EXTRACT(EPOCH FROM '2021-10-01'::timestamp)::INT
写法2(适配复杂日期筛选场景)
将原字段转换为日期类型后比对,适合需要灵活做日期运算的场景:
SELECT split_part((timestamp '1970-01-01'::date + impression_time * interval '1 second'), ' ', 1) AS impression_date FROM impression_db WHERE (timestamp '1970-01-01'::date + impression_time * interval '1 second') >= '2021-09-01'::timestamp AND (timestamp '1970-01-01'::date + impression_time * interval '1 second') < '2021-10-01'::timestamp
内容的提问来源于stack exchange,提问作者MktQuery
相关产品推荐
相关产品推荐

