【问题标题】:add interval to timestamp with milis from jsonb使用来自jsonb的milis将间隔添加到时间戳
【发布时间】:2020-11-05 18:26:30
【问题描述】:

在 DB 中,我有一个对象数组

[{"effectiveTo":"1603939934019","effectiveFrom":1603896734146}]

我需要检查 EffectiveFrom 是否比现在大 - 7 天或 EffectiveFrom + 1 年是否低于 EffectiveTo 我做了第一部分,但我在第二部分有点迷失,有很多演员,我仍然得到@ 987654322@ 错误出现在以下情况:

(
    (value->>'effectiveFrom')::bigint > (extract('epoch' from now() - INTERVAL '7 DAYS')::bigint * 1000)  
    or (value->>'effectiveTo')::bigint < (extract('epoch'from((value ->>'effectiveFrom')::bigint * 1000)::timestamp + INTERVAL '1 YEAR'))::bigint
) 

可能我错过了一些接近提取方法的东西。 不幸的是 EffectiveTo 是一个字符串,当 EffectiveFrom 是一个 bigint 时,我无法更改它,所以请记住它

【问题讨论】:

    标签: sql arrays json postgresql datetime


    【解决方案1】:

    由于您需要无法直接在 unix 时间戳上执行的日期算术(例如添加年份),我发现将这两个值转换为 timestamps 可能更简单,然后您可以轻松操作。

    假设您在表 mytable 的列 js 中有一个 jsonb 数组,您可以将查询表述为:

    select v.*
    from mytable t
    cross join lateral jsonb_array_elements(t.js) j(obj)
    cross join lateral (values(
        to_timestamp((obj ->> 'effectiveFrom')::bigint / 1000), 
        to_timestamp((obj ->> 'effectiveTo'  )::bigint / 1000)
    ) v(effective_from, effective_to)
    where 
        v.effective_from > now() - interval '7 day'
        or (v.effective_to > v.effective_from + interval '1 year')
    

    【讨论】:

    • 在这种情况下它可能相当微不足道,但仍然 - 转换为 bigint 会丢失精度(毫秒),而转换为 double precision 会保留它。
    猜你喜欢
    • 2021-03-18
    • 1970-01-01
    • 2023-03-31
    • 2015-03-09
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    相关资源
    最近更新 更多