【问题标题】:How to use Unix epoch time values with Postgres tsrange and tstzrange types?如何将 Unix 纪元时间值与 Postgres tsrange 和 tstzrange 类型一起使用?
【发布时间】:2014-12-01 06:54:00
【问题描述】:

是否可以在不先转换为其他时间字符串格式的情况下将 Unix 纪元时间值插入 tstzrange/tsrange 类型的字段?

使用 Postgres 9.3,当为 tstzrange/tsrange 提供 to_timestamp() 值时会产生无效的输入语法错误:

=> select '["to_timestamp(1267253400.069539)",]'::tstzrange;
ERROR:  invalid input syntax for type timestamp with time zone: "to_timestamp(1267253400.069539)"
LINE 1: select '["to_timestamp(1267253400.069539)",]'::tstzrange;

这有点令人困惑,因为 to_timestamp() 返回一个带时区时间戳类型的值。

这并不像这些类型的字段不允许使用函数那么简单,因为 now() 函数可以正常工作:

=> select '["now()",]'::tstzrange;
               tstzrange
---------------------------------------
["06-OCT-14 15:11:05.488949 -07:00",)
(1 row)

我现在使用的解决方案是将纪元时间转换为格式化的字符串(例如,'2010-02-27T06:50:00.069539-00'),它适用于 tstzrange/tsrange。我认为这不如直接提供纪元时间有效,如果有可能,我将不胜感激。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    => select '["to_timestamp(1267253400.069539)",]'::tstzrange;

    这不是提供带有to_timestamp 输出的tstzrange。

    它试图使用文本字符串"to_timestamp(1267253400.069539)" 作为时间戳范围前半部分的文字值。

    你会想要使用方便的函数表单构造函数:

    select tstzrange( to_timestamp(1267253400.069539),null );
    

    ...这样任何包含的表达式都会被评估。

    【讨论】:

    • 谢谢,构造函数正是我所需要的。我仍然有点困惑,为什么 now() 的示例有效,它显然是在评估该表达式。
    • @terse now() 是一个非常奇怪的特殊情况。我真的想从文档中的示例中删除所有对它的引用,将其归入附录,这就是如此混乱的历史黑客保证的全部内容。本质上,PostgreSQL 在解析时将字符串文字 now() 视为特殊情况的时间戳表示,隐式地将其转换为当前时间戳。这就是为什么将now() 转换为时间戳是有效的。现在你应该改用current_timestamp 伪函数。
    猜你喜欢
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 2020-09-29
    • 2017-04-06
    相关资源
    最近更新 更多