2017-05-09 52 views
1

我有一個Postgres 9.1數據庫與選擇任用從表如下日期(appts):試圖從日期列表拉的下一個約會

id | apptdate 
---|----------- 
1 | 2017-05-01 
2 | 2017-05-07 
3 | 2017-05-14 
4 | 2017-05-21 
5 | 2017-05-28 

我試圖拉離下一個約會這個清單。

如果current_date是2017-05-05,我希望結果是2017-05-07。

如果current_date是最後apptdate之前,這個工程:

SELECT apptdate FROM appts WHERE apptdate >= current_date 
ORDER BY apptdate 
LIMIT 1 

但是,如果current_date是最後apptdate後,我想選擇上次apptdate

在上面的示例中,如果current_date爲2017-06-15,我希望結果是2017-05-28。

回答

-1

你可以試試下面的查詢

DO 
$do$ 
BEGIN 
IF EXISTS (SELECT 1 FROM appts WHERE apptdate >= current_date) THEN 
    SELECT apptdate FROM appts WHERE apptdate >= current_date 
     ORDER BY apptdate LIMIT 1; 
ELSE 
    SELECT apptdate FROM appts 
     ORDER BY apptdate DESC LIMIT 1; 
END IF; 
END 
$do$ 

此查詢使用IF ELSE END IF控制結構,基於該EXISTS條款的條件。

+0

你能指出其中 「IF ELSE END IF」 是一個有效的PostgreSQL手冊中的SQL語句? https://www.postgresql.org/docs/current/static/ –

+0

此代碼將引發以下錯誤: 錯誤:在「IF」或其附近出現語法錯誤。 – kipsoft

+0

@kipsoft已更新 – DhruvJoshi

0
select apptdate 
from (
    (
     select apptdate 
     from appts 
     where apptdate >= current_date 
     order by apptdate 
     limit 1 
    ) 
    union all 

    select max(apptdate) 
    from appts 
) s 
order by apptdate 
limit 1 
+0

看起來你不能從DO函數返回結果。 – kipsoft

+0

@kipsoft:匿名'do'塊如何與這個問題相關? –

0

使用或使用條件與MAX(apptdate)

SELECT apptdate 
FROM appts 
WHERE (apptdate >= '2017-05-08' OR apptdate = (select max(apptdate) from appts)) 
ORDER BY apptdate 
LIMIT 1 
 
| apptdate | 
| :--------- | 
| 2017-05-14 | 
SELECT apptdate 
FROM appts 
WHERE (apptdate >= '2017-06-15' OR apptdate = (select max(apptdate) from appts)) 
ORDER BY apptdate 
LIMIT 1 
 
| apptdate | 
| :--------- | 
| 2017-05-28 | 

dbfiddle here

相關問題