如何使用Postgres tsrange和tstzrange类型的Unix纪元时间值?

时间:2014-10-06 22:39:17

标签: postgresql

是否可以将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一起工作正常。我认为这不如直接提供纪元时间那么高效,并希望知道是否有可能。

1 个答案:

答案 0 :(得分:1)

  

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

这不会为tstzrange提供to_timestamp输出。

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

您将需要使用方便的函数表单构造函数:

select tstzrange( to_timestamp(1267253400.069539),null );

......就这样评估任何包含的表达式。