Redshift中如何计算两个时间戳的精确天数差值(含小数)
解决Redshift中时间戳的小数天数差值计算问题
我懂你的痛点——Redshift的datediff(day)确实没法满足这种按实际时长比例计算小数天数的需求,它只会统计两个时间戳跨越了多少个日期边界,当天内的时长差都会返回0。咱们换个方式就能轻松实现你要的效果:
方法一:基于秒数计算(精度最高)
先算出两个时间戳的总秒数差,再除以一天的总秒数(86400),就能得到精确的小数天数:
SELECT (datediff(second, '2011-12-31 8:30:00', '2011-12-31 20:30:00')::float / 86400) AS day_diff;
执行这个语句会返回0.5,正好符合你12小时等于0.5天的需求。如果是8小时的差值,结果会是0.333333...,完全匹配预期。
方法二:基于小时/分钟计算(按需选择)
如果不需要秒级精度,也可以用小时差除以24,或者分钟差除以1440:
-- 按小时计算 SELECT (datediff(hour, '2011-12-31 8:30:00', '2011-12-31 20:30:00')::float / 24) AS day_diff; -- 按分钟计算 SELECT (datediff(minute, '2011-12-31 8:30:00', '2011-12-31 20:30:00')::float / 1440) AS day_diff;
这两个语句同样会返回0.5,适合对精度要求稍低的场景。
为什么datediff(day)不符合需求?
Redshift的datediff(day)逻辑是统计日期边界的跨越次数,比如只要两个时间戳在同一天内,不管差1小时还是23小时,结果都是0;只有当结束时间跨过了第二天的0点,才会开始计数1、2...这就是你之前得到0的原因。
内容的提问来源于stack exchange,提问作者Bilberryfm
相关产品推荐
相关产品推荐

