2017-05-09 47 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

相关问题