2011-01-21 118 views
0

我有一个开始订单日期字段和一个停止订单字段我需要检查数据库以查看开始和止损订单是否在任何支付期开始和结束字段之外。说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

什么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; 
+0

好吧,让我们再试试这个,是有一种方法可以在我使用(其中to_char(start_order,'MM')= to_char(ppd_start)和to_char(end_order,'MM'))之间使用两个日期(start_order和end_order)字段(ppd_start和ppd_end) = to_char(ppd_end, 'MM')和start_order!= ppd_start和end_order!= ppd_end和start_order不在ppd_start和ppd_end之间,end_order不在ppd_start和ppd_end之间),但它会一直显示符合ppd_start和ppd_end之间的日期。为什么? – Frank 2011-01-21 01:46:52

相关问题