Re: выбоpка по дате
- From
- Dmitry Prokopenko (2:5020/400)
- To
- Andrey Veresov (2:5054/37.63)
- Date
- 2005-03-28T05:56:02Z
- Area
- SU.DBMS.INTERBASE
From: Dmitry Prokopenko <dimas@vladivostok.net>
Здравствуйте, Andrey.
Вы писали 26 марта 2005 г., 3:08:12:
> Добpо пожаловать на боpт, шкипеp All
> Есть табличка учётов отпусков. Там есть поля типа DATA начала (DBO) и
> конца (DEO), напpимеp, 21.12.04 и 11.01.05. Необходимо выбpать людей, с
> указанием человекодней, за *любой* выбиpаемый этап, напpимеp, 2 месячных отчета
> 01.12.04-31.12.04 и 01.01.05-31.01.05, т.е. наш пpимеpный отпуск pазбивается
> на 2 интеpвала: 21.12.04-31.12.04 и 01.01.05-11.01.05. Как это можно
> pеализовать на стоpоне *сеpвеpа*, Диалект 1 (т.к. базе 5 лет)?
> ЗЫ: пpобовал сегодня с помощью if-ов, не нpавится, должен быть более изящный
> способ.
Не знаю, как было сделано при помощи if-ов, но в голову пришло 2
варианта:
1. При помщи функции.
Делаем две функции (могут быть варианты).
f_max(date1, date2)
f_min(date1, date2)
а потом запрос:
select f_max(DBO, report_begin_date), f_min(DEO, report_end_date)
from <твоя_таблица>
where (DBO >= report_start_date) or (DEO <= report_end_date)
2. Делаем три запроса а потом объединяем их результаты
select DBO, DBE
from <твоя_таблица>
where (DBO >= report_start_date) and (DEO <= report_end_date)
union
select DBO, report_end_date
from <твоя_таблица>
where (DBO >= report_start_date) and (DEO > report_end_date)
union
select report_start_date, DEO
from <твоя_таблица>
where (DBO < report_start_date) and (DEO <= report_end_date)
P.S.: Правильный синтаксис смотри в мануале, ибо с ib давно не
работал.
--
С уважением,
Dmitry Prokopenko mailto:dimas@vladivostok.net
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5.3
* Origin: Talk.Mail.Ru (2:5020/400)
SEEN-BY: 46/50 50/203 450/186 1024 451/30 454/9 461/132 640 469/999 4616/3
SEEN-BY: 4625/8 4627/10 4646/1 5000/76 5000 5001/5001 5002/79 5003/57 5006/1
SEEN-BY: 5007/1 5010/53 70 5011/13 5012/23 5020/52 118 175 400 545 604 715 758
SEEN-BY: 5020/894 1042 1057 1523 1604 1835 2238 4441 8383 5021/29 5022/128
SEEN-BY: 5025/3 750 5026/14 5027/16 5030/115 556 966 1063 1900 5032/14 5036/1
SEEN-BY: 5040/47 5042/13 5051/15 5054/1 8 9 28 35 37 45 63 5055/95 5057/1
SEEN-BY: 5061/15 5062/1 5066/18 5069/7 5070/1222 5080/68 1003 5081/2 5082/6
SEEN-BY: 5083/21 5085/13 5095/20 6000/254
PATH: 5020/400 4441 545 5054/1 37