Postgres - 将TSTZRANGE拆分为两列

7

我正在使用PostgreSQL 9.4。 我有一张表中的列名为timerange,想要编写一个SELECT查询,该查询将以两个单独的列time_starttime_end返回时间范围。 我尝试像处理数组一样处理它,但它不起作用:

select *, timerange[0] as t_start from schedules;

当前表格:

| id |                    timerange                        |  
|----|-----------------------------------------------------|  
| 1  | ["2017-05-05 19:00:00+02","2017-05-05 21:00:00+02") |  
| 2  | ["2017-05-05 19:00:00+02","2017-05-05 21:00:00+02") |  

所需表格:

| id |        time_start        |       time_end           | 
|----|--------------------------|--------------------------|
| 1  | "2017-05-05 19:00:00+02" | "2017-05-05 21:00:00+02" |  
| 2  | "2017-05-05 19:00:00+02" | "2017-05-05 21:00:00+02" |  
1个回答

19

使用 lower()upper()

就像这样:

SELECT lower(tsrng) AS start, upper(tsrng) AS end
FROM (
  SELECT tstzrange('2017-05-05 12:00:05', '2017-05-05 16:00:05', '[)') AS tsrng
) sub;

或者以你的例子为例:

select *, lower(timerange) as t_start, upper(timerange) as t_end from schedules;

运行得很好,但我认为时区丢失了,因为从这个时间范围 ["2017-05-05 14:00:00+02","2017-05-05 15:00:00+02") 中,我得到的 t_start 等于 2017-05-05 14:00:00.000000 - veich
@veich 时区信息在这里。很可能,你的客户端会解释响应并将其转换为本地时区。 - pozs
在我看来,最好始终将时区保存在数据库中的协调世界时。 - Abdlrahman Saber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接