Postgresql

根據開始停止列從表行中獲取日期間隔

  • February 7, 2017

我有一個返回以下結果集的表:

 mydate    | startstop
------------+----------
2018-02-07 | start
2018-02-14 | stop
2017-02-06 | start
2017-02-12 | stop
2016-02-05 | start 
2016-02-12 | stop 

我需要知道我的目前日期是否在某個時間間隔內,例如,如果我從目前日期查詢表'2017-02-07',我需要獲取'TRUE'.

我知道它看起來很簡單,但它並不簡單!

我發現的最好的是:

      select true 
       where '2017-02-06'>=
        (select mydate from mytable where starstop='start' order by id limit 1) 
       and '2017-02-06' <= 
        (select mydate from mytable where startstop='stop' order by id limit 1);

如果日期在每個間隔之一中,它就會返回TRUE,但前提是表格將來沒有間隔,並且您可以看到我的表格將來有間隔。

注:數據庫管理系統為PostgreSQL 9.1

其實很簡單。從想要的日期開始並遞減日期,直到找到第一行。如果是,'start'那麼你在一個區間內。如果是'stop',您不是:

select 
 ( select startstop
   from mytable 
   where mydate = '2017-02-07' and startstop = 'start'
      or mydate < '2017-02-07'
   order by mydate desc
   limit 1
 ) = 'start'
 as result ;

複雜WHERE的是處理包含的日期範圍。如果使用包含-排他,則條件會更簡單。

類似的方式 - 也許更清楚一點 - 將是:

with ct as 
 ( select mydate, startstop
   from mytable 
   where mydate <= '2017-02-07'
   order by mydate desc
   limit 1
 )
select 
      ('start') = (select startstop from ct) 
   or ('2017-02-07', 'stop') = (table ct) 
 as result ;

引用自:https://dba.stackexchange.com/questions/163467