我目前正在从旧版本的 Microsoft sql server 过渡到 PostgreSql 环境。我找不到将时间戳的年龄与设定值进行比较的方法。这是在 where 子句中,因为目标是获取存储的时间戳并找到它与当前时间之间的差异,然后查看它是否大于 90 天。
原始的 MSQL Server 查询:
DATEDIFF(DAY, stored_timestamp,GETDATE())>90
当前失败的 Postgres 尝试:
(stored_timestamp - current_timestamp) > stored_timestamp + interval '90 Days'
我还使用了其他形式的抓取当前时间并在没有添加间隔的情况下对它们进行类型转换,并且通常会遇到相同的错误。最常收到的错误是“运算符不存在:间隔 > 时间戳”或它显示我不能使用 > 将间隔与其他形式的时间/日期数据进行比较的类型。
您的 SQL Server 操作
DATEDIFF(DAY, stored_timestamp,GETDATE())>90
在 postgresql 中是
extract( day from (current_timestamp -stored_timestamp)) > 90
为了做整数之间的比较
一个简单但天真的方法是:
stored_timestamp < current_timestamp - interval '90 day'
但是这不会完全一样。来自 SQL 服务器文档:
此函数返回指定datepart边界在指定
startdate
和enddate
之间交叉的计数[...]。
通常,在 SQL Server 中:
select datediff(day, '2023-04-28 23:59:59', '2023-04-29 00:00:00')
返回
1
,因为在这 1 秒的跨度内跨越了一天的边界(实际上:达到)。
你不会在 Postgres 中得到相同的行为,如果我们用
extract
计算日期差异,我们可以看到这一点:
select extract(
day from (
'2023-04-29 00:00:00'::timestamp
- '2023-04-28 23:59:59'::timestamp
)
)
返回
0
,因为 1 秒的间隔有 0 天。
如果你想要在 Postgres 中有相同的行为,那么你一个简单的方法是首先将时间戳转换为日期(......以效率为代价,除非你专门针对它进行优化):
stored_timestamp::date < current_date - interval '90 day'