Форум: "Базы";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
ВнизНапоминалка для Дней Рождения Найти похожие ветки
← →
Harry7 © (2005-06-02 14:38) [0]Всем здравствуйте.
Такую вот штуку пишу. Хочется, чтобы программа выдавала напоминание о днях рождения за выбранное количество дней.
Есть база пиплов с занесенными датами рождения. Есть форма с SQL-запросом и DBGrid, есть два календаря для
указания граничных значений времени (интервал "от" и "до").
Запрос:SELECT Base."Code", Base."Name", Base."Birthday"
FROM "Base.DB" Base
WHERE Base."Birthday" BETWEEN :OT AND :DO
:OT и :DO - соответственно значения, которые будут выбираться в двух календарях на форме
Запрос должен вернуть людей, у которых ДР в интервале "от"-"до".
Но год мне не нужен, нужно, чтобы из даты выхватывался месяц. Из величин ОТ и ДО я его достаю функциями
DecodeDate(OT, Year, Month, Day) и DecodeDate(DO, Year, Month, Day). А вот как достать из набора данных
Base."Birthday"? Там полная дата, день-месяц-год, сравнивать ее с месяцем - некорректно.
Как извлечь месяц из поля DateTime базы данных?
← →
Johnmen © (2005-06-02 14:54) [1]
SELECT * FROM Base
WHERE EXTRACT(DAY FROM Birthday)+100*EXTRACT(MONTH FROM Birthday)
BETWEEN
EXTRACT(DAY FROM :OT)+100*EXTRACT(MONTH FROM :OT)
AND
EXTRACT(DAY FROM :DO)+100*EXTRACT(MONTH FROM :DO)
← →
Anatoly Podgoretsky © (2005-06-02 16:06) [2]Johnmen © (02.06.05 14:54) [1]
Только частично рабочее решение, даст неверный результат при в декабре=январе.
← →
Johnmen © (2005-06-02 16:12) [3]>Anatoly Podgoretsky © (02.06.05 16:06) [2]
Возможно. Я не тестил. Так, общий план :)
← →
Anatoly Podgoretsky © (2005-06-02 16:17) [4]Johnmen © (02.06.05 16:12) [3]
Я тестил, у меня была аналогичная задача
← →
ANB © (2005-06-03 08:21) [5]В оракле будет так :
create table test_BD (dtBD date)
select Dtbd
from (select Dtbd
,to_date (to_char (Dtbd, "DD.MM.") || to_char (to_date (:Dtbegdate, "DD.MM.YYYY"), "YYYY"), "DD.MM.YYYY") Dtbd_F
from Test_Bd
union all
select Dtbd
,to_date (to_char (Dtbd, "DD.MM.") || to_char (to_number (to_char (to_date (:Dtbegdate, "DD.MM.YYYY"), "YYYY")) + 1)
,"DD.MM.YYYY"
) Dtbd_F
from Test_Bd)
where Dtbd_F between to_date (:Dtbegdate, "DD.MM.YYYY") and to_date (:Dtbegdate, "DD.MM.YYYY") + :Days
А как в парадоксе - не знаю :(((((
← →
Johnmen © (2005-06-03 09:39) [6]>ANB © (03.06.05 08:21) [5]
Я всегда недоумеваю, зачем говорят не по теме. Причём сами же в этом сознаются!
Словесный понос ? Скука ? Неуместное желание показать свои знания ? Или что ?
PS А насчёт Оракла, не думаю, что всё ТАК запущено.
← →
stud © (2005-06-03 10:33) [7]вот возник вариант
SELECT Base."Code", Base."Name", Base."Birthday"
FROM "Base.DB" Base
WHERE :dd-Base."Birthday" between :ot and :od
где :dd - параметр типа дата представляет собой текущий месяц и день но год=году рождения чела, т.е. при :dd-Base."Birthday" получаем количество дней меджу датами которое должно попасть в интервал :ot and :od - целые числа
← →
Johnmen © (2005-06-03 10:49) [8]>Anatoly Podgoretsky © (02.06.05 16:17) [4]
Подправил :)SELECT * FROM Base
WHERE EXTRACT(DAY FROM Birthday)+100*EXTRACT(MONTH FROM Birthday)
+10000*(EXTRACT(YEAR FROM Birthday)-EXTRACT(YEAR FROM :OT))
BETWEEN
EXTRACT(DAY FROM :OT)+100*EXTRACT(MONTH FROM :OT)
AND
EXTRACT(DAY FROM :DO)+100*EXTRACT(MONTH FROM :DO)+
+10000*(EXTRACT(YEAR FROM :DO)-EXTRACT(YEAR FROM :OT))
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.039 c