检查“系统”是否落在SQL中的两个日期之间

时间:2016-06-07 03:52:45

标签: sql oracle plsql oracle11g

Scenarion是DEMO001系统,由8月10日至8月11日由一些用户预订。

START_DATE     END DATE    SYSTEM
2016-08-10     2016-08-11  DEMO001
2016-09-05     2016-09-08  DEMO001
2016-08-08     2016-08-11  DEMO013
2016-08-16     2016-08-18  DEMO017

如果其他用户尝试在这些天之间预订此系统。我们必须检查并传递0或1。

我将获得一个输入参数

1) start_date as 2016-08-08 and 2016-08-15.
2) 2016-09-06 and 2016-09-07
3) 2016-08-08 and 2016-08-09

我必须写一个PLSQL / SQL代码来传递0,因为DEMO001介于这些开始数据和输入结束日期之间传递1。

请帮助。

2 个答案:

答案 0 :(得分:2)

Oracle安装程序

CREATE TABLE table_name ( START_DATE, END_DATE, SYSTEM ) AS
SELECT DATE '2016-08-10', DATE '2016-08-11', 'DEMO001' FROM DUAL UNION ALL
SELECT DATE '2016-09-05', DATE '2016-09-08', 'DEMO001' FROM DUAL UNION ALL
SELECT DATE '2016-08-08', DATE '2016-08-11', 'DEMO013' FROM DUAL UNION ALL
SELECT DATE '2016-08-16', DATE '2016-08-18', 'DEMO017' FROM DUAL;

<强>查询

使用绑定变量:start_date:end_date作为输入:

SELECT system,
       MIN(
         CASE
         WHEN :end_date < start_date OR :start_date > end_date
         THEN 1
         ELSE 0
         END
       ) AS can_book
FROM   table_name
GROUP BY system;

<强>输出

输入:start_date = DATE '2016-08-08':end_date = DATE '2016-08-15'

SYSTEM    CAN_BOOK
------- ----------
DEMO001          0 
DEMO013          0 
DEMO017          1 

输入:start_date = DATE '2016-09-06':end_date = DATE '2016-09-07'

SYSTEM    CAN_BOOK
------- ----------
DEMO001          0 
DEMO013          1 
DEMO017          1 

输入:start_date = DATE '2016-08-08':end_date = DATE '2016-08-09'

SYSTEM    CAN_BOOK
------- ----------
DEMO001          1 
DEMO013          0 
DEMO017          1 

答案 1 :(得分:1)

根据您的要求,如果开始日期或结束日期介于给定记录之间,您希望禁止预订。您可以使用CASE表达式。我已将2016-08-082016-08-15硬编码为您正在使用的开始日期和结束日期。

SELECT SYSTEM,
    CASE WHEN (DATE '2016-09-06' < START_DATE AND DATE '2016-09-07' < START_DATE) OR
              (DATE '2016-09-06' > END_DATE AND DATE '2016-09-07' > END_DATE)
         THEN 1
         ELSE 0
    END AS allowBooking
FROM yourTable

以下是指向SQL小提琴的链接,其中显示了2016-08-082016-08-09的输入范围内的查询。它清楚地表明,除了DEMO013之外,所有预订都是可能的。我使用MySQL,但逻辑不应该从MySQL转向Oracle,反之亦然。

SQLFiddle