2011-01-21 2 views
0

У меня есть поле даты начала заказа и поле стоп-ордера. Мне нужно проверить базу данных, чтобы узнать, не являются ли начальные и конечные заказы за пределами полей начала и конца периода оплаты , Скажем, 01-авг-10 и 14-авг-10 и 15-авг-10 и 28-авг-10 и 29-ауг-10 и 11-сегмент-10 - все периоды оплаты за один месяц. Стартовый порядок 01-авг-10 и конечный заказ 14-авг-10. Тем не менее, когда я делаю SQL, который сказал (где конечный заказ не начинается между началом периода оплаты и периодом оплаты), появляется 01-ауг-10 до 14-авг-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

Хорошо, давайте попробуем это опять же, есть способ сделать это между использованием двух полей даты (start_order и end_order) между (ppd_start и ppd_end), когда я использую (где to_char (start_order, 'MM') = to_char (ppd_start) и to_char (end_order, 'MM'), = 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

+0

Оператор SQL OVERLAPS SQL выполняет две даты. Я отредактировал свой ответ, чтобы включить примеры перекрытия. –

+0

Ок выглядит интересным, но SQL работает внутри веб-страницы. Так что, говоря, что выпадающие варианты привязаны к выбранным таблицам в базе данных, а выбранный элемент заполняет SQL. Поэтому я хотел бы немного больше на сайте о том, как работать с этим SQL, не имея необходимости использовать физические даты в поле. DDL_1 выбирает физический год для поиска и тянет с pp_yr, а затем пользователь выбирает месяц для просмотра с DDL_2, который тянет с ppd_mon (1 -12), а затем сравнивает с помощью to_char (start_order, 'MM') = ppd_mon и to_char (end_order, 'MM') = ppd_mon и start_order не между ppd * – Frank

Смежные вопросы