Запрос даты начала и окончания между двумя полями даты - PullRequest
0 голосов
/ 21 января 2011

У меня есть поле даты стартового ордера и поле стоп-ордера. Мне нужно проверить базу данных, чтобы увидеть, находятся ли стартовые и стоп-ордера вне какого-либо из полей начала и окончания периода оплаты.Скажем, 01-августа-10 и 14-августа-10 и 15-августа-10 и 28-августа-10 и 29-августа-10 и 11-го сентября 10 все периоды оплаты в одном месяце.Стартовый ордер 01-авг-10 и конечный ордер 14-авг-10.Тем не менее, когда я делаю SQL, который сказал (где конечный заказ не между началом платежного периода и окончанием платежного периода), 01-aug-10 до 14-aug-10 все еще появляется.Мои потребности в том, чтобы найти какие-либо даты, которые соответствуют остановке поиска и переходу к следующему порядку начала записи и остановке заказа и запуску следующего поиска до тех пор, пока мы не достигнем конца требований поиска записи.по месяцам и годам, чтобы запрос отвечал.База данных довольно большая.Мой запрос выглядит так, как будто он выполняет только промежуточную проверку, а затем показывает все данные, которые соответствуют между началом и окончанием периода оплаты, и это те данные, которые я не хочу видеть!

1 Ответ

1 голос
/ 21 января 2011

Что дБмс?

Итак, у вас есть такой стол?

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;
...