【问题标题】:How to use the NOW() function as upper bound of a range?如何使用 NOW() 函数作为范围的上限?
【发布时间】:2019-06-20 16:44:33
【问题描述】:

我在 Postgres 10.6 数据库中有一个包含 tstzrange 类型列的表。 我需要插入/更新具有已定义下限但当前时间值作为范围上限的行,因此将NOW() 作为上限。

尝试过类似的方法:

UPDATE table_name
SET date_range = ['2018-03-23 00:00:00-05', now())
WHERE id = 3;

有没有办法使用内置函数或子查询?

【问题讨论】:

    标签: sql postgresql insert range range-types


    【解决方案1】:

    使用 范围构造函数The manual:

    每个范围类型都有一个与 范围类型。使用构造函数更频繁 比编写范围文字常量方便,因为它避免了 需要额外引用绑定值。构造函数 接受两个或三个参数。两个参数的形式构造一个 标准形式的范围(包括下限,不包括上限), 而三参数形式构造了一个范围为 第三个参数指定的形式。第三个参数必须是一个 字符串“()”、“(]”、“[)”或“[]”。

    所以:

    UPDATE table_name
    SET    date_range = tstzrange('2018-03-23 00:00:00-05', now())
    WHERE  id = 3;
    

    我假设您知道now() 解析为事务的开始时间。

    【讨论】:

    • 令人惊讶的是select '[2018-03-23 00:00:00-05,now)'::tstzrangeselect '[2018-03-23 00:00:00-05,now()'::tstzrange 也可以工作,但select '[2018-03-23 00:00:00-05,now())'::tstzrange 不行。 (链接问题中前两个的原因)。
    • @ErwinBrandstetter:谢谢。之前我接受不了。它现在被接受了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多