查询两个日期字段之间的开始和停止日期

时间:2011-01-21 00:33:05

标签: sql date between

我有一个开始订单日期字段和停止订单字段我需要检查数据库以查看启动和停止订单是否在任何付款期间开始和结束字段之外。比如01-aug-10和14-aug-10以及15-aug-10和28-aug-10以及29-aug-10和11-sep-10都是一个月内的所有支付期。起始顺序01-aug-10和结束顺序是14-aug-10。然而,当我做一个SQL说(最终订单不在支付期开始和支付期结束之间)时,01-aug-10到14-aug-10仍然显示出来。我的需求是,如果它找到任何匹配停止查找的日期并转到下一个记录开始订单并停止订单并开始下一次搜索,直到我们达到记录搜索要求的结束。

我希望按月和按年搜索以保持查询的响应性。数据库非常大。我的查询接缝就像只进行一次检查,然后它显示了支付期间开始和结束之间的所有数据,这就是我不想看到的数据!

1 个答案:

答案 0 :(得分:1)

什么是dbms?

所以你有一张这样的桌子?

CREATE TABLE something
(
  pay_period_start date NOT NULL,
  pay_period_end date NOT NULL,
  CONSTRAINT something_pkey PRIMARY KEY (pay_period_start),
  CONSTRAINT something_pay_period_end_key UNIQUE (pay_period_end),
  CONSTRAINT something_check CHECK (pay_period_end > pay_period_start)
);
insert into something values ('2010-08-01', '2010-08-14');
insert into something values ('2010-08-15', '2010-08-28');
insert into something values ('2010-08-29', '2010-09-11');

然后我可以运行此查询。 ('2010-08-14'是您的止损订单栏或结束订单栏的值或类似的值。)

select * from something
where '2010-08-14' not between pay_period_start and pay_period_end
order by pay_period_start;

我得到了

2010-08-15;2010-08-28
2010-08-29;2010-09-11

对于日期对,请使用OVERLAPS运算符。此查询

select * from something
where 
  (date '2010-08-01', date '2010-08-14') overlaps 
  (pay_period_start,  pay_period_end) 
order by pay_period_start;

返回

2010-08-01;2010-08-14

要排除起始订单和结束订单与付款期间完全匹配的行,请使用以下内容:

select * from something
where (
  (date '2010-08-01', date '2010-08-14') overlaps 
  (pay_period_start, pay_period_end)               and
  (date '2010-08-01' <> pay_period_start)          and
  (date '2010-08-14' <> pay_period_end)
)
order by pay_period_start;