回答

收藏

Postgres-将TSTZRANGE分为两列

技术问答 技术问答 291 人阅读 | 0 人回复 | 2023-09-13

我使用PostgreSQL9.4我有一个名为表列timerange,并希望写一个SELECT查询将返回的时间范围在两个单独的列time_start和time_end。我试图像数组一样处理它,但是它不起作用:
2 N7 n* M9 _2 ?) N! k9 d/ Yselect *, timerange[0] as t_start from schedules;) E% Y" \) Q  Y' r+ \
当前表:) K( [4 A8 T3 l5 z7 \4 }4 E
| id |                    timerange                        |  8 r- a$ z/ u7 W. z0 H
|----|-----------------------------------------------------|  
# D8 z9 ~5 K  I- D& s| 1  | ["2017-05-05 19:00:00+02","2017-05-05 21:00:00+02") |  5 W" `3 E( A) w* ~9 |
| 2  | ["2017-05-05 19:00:00+02","2017-05-05 21:00:00+02") |
, b! |2 A& S; @# h2 S* h; t3 `所需表:9 |4 S. Y4 c% d1 M
| id |        time_start        |       time_end           | % A! o- b% \8 i, _' U1 g0 q- s
|----|--------------------------|--------------------------|
5 _0 D7 l( v: x* u% f* p, L" s5 {| 1  | "2017-05-05 19:00:00+02" | "2017-05-05 21:00:00+02" |  
; Y1 ]0 K2 `: ~+ G| 2  | "2017-05-05 19:00:00+02" | "2017-05-05 21:00:00+02" |
1 c5 X9 U, c* H                ' s* w7 _+ g2 A% j7 u6 |7 X) }
解决方案:/ \2 s  t' R& l9 B& R2 H8 `4 c
               
5 |+ o0 ?$ G  k. s0 c( i6 s- E9 r) `+ ]! c3 r6 g' H; ]
- S+ t% v2 E5 f1 f4 l2 c
                使用 lower()和upper()。9 J; Y4 q* t9 S$ ?
像这样:2 W- n/ a+ m9 H. t
SELECT lower(tsrng) AS start, upper(tsrng) AS end( P4 L! y' ]5 F5 O  p
FROM (+ b3 G! `2 k5 W* @2 F
  SELECT tstzrange('2017-05-05 12:00:05', '2017-05-05 16:00:05', '[)') AS tsrng
9 y9 W& ^- V' s/ `9 R2 F9 o) sub;) u4 i/ }, j7 t
或您的示例:! A, t, c8 ^# H! ^) Z
select *, lower(timerange) as t_start, upper(timerange) as t_end from schedules;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则