Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > как отловить кто дату когда у человека день рожден


Автор: Berliner 18.8.2005, 13:32
Здраствуйте вот такая ситуация!
Есть таблица(Paradox "people.db")
В ней поля
Фамилия
Имя
Навыки
Дата рождения тип Date

как сделать так чтобы пользователь ввел период(2 даты) в 2 поля едит1 и едит2
задал например 1.02.2005 по 28.02.2005 и ком нашел у кого день рождения в этом месяце

подскажите самый простой вариант пожалуста

Автор: Pakshin A. S. 18.8.2005, 15:15
Код

with query1 do
 begin
  Close;
  SQL.Text:='SELECT * FROM "people.db" WHERE BirthDate BETWEEN ''' + Edit1.Text + ''' AND ''' + Edit2.Text + ''';';
  Open;
 end;

Автор: Guest 18.8.2005, 23:04
Спасибо за помощь!
Опс я тоже так думал! НО.....
по этому запросу компьютер выберет людей которые родились с и по
Например с 1.08.2005 по 31.08.2005 и выберет тех людей которые родились в этот промежутое - это хорошо
но надо выбрать и поздравить сех людей которые родились в Августе! и тех кому 25, 50,21 и т.д. всех у кого день рождения в этом периоде с 1.08.2005 по 31.08.2005

Автор: Guest 18.8.2005, 23:12
А не только те которые родились в этом месяце
А иначе с 1.08.2005 по 31.08.2005 отберет только младенцев а поздравить других людей постарше?
Спасиб за внимание

Автор: bursa 19.8.2005, 08:33
В теме http://forum.vingrad.ru/index.php?showtopic=61283 уже было.
Исправь код SergeBS на CalcDay := FormatDateTime('mmdd', DateFld);
т.е. месяцы вперед.

И фильтруй Query1.Filter:='CalcDay>=+''''+'0106'+''''+ and Query1.Filter<+''''+'0107'+'''';

Автор: Pakshin A. S. 19.8.2005, 08:50
Цитата(Guest @ 19.8.2005, 00:04)
Спасибо за помощь!
Опс я тоже так думал! НО.....
по этому запросу компьютер выберет людей которые родились с и по
Например с 1.08.2005 по 31.08.2005 и выберет тех людей которые родились в этот промежутое - это хорошо
но надо выбрать и поздравить сех людей которые родились в Августе! и тех кому 25, 50,21 и т.д. всех у кого день рождения в этом периоде с 1.08.2005 по 31.08.2005


Цитата(Guest @ 19.8.2005, 00:12)
А не только те которые родились в этом месяце
А иначе с 1.08.2005 по 31.08.2005 отберет только младенцев а поздравить других людей постарше?
Спасиб за внимание

Что-то непонятно....
По-полочкам: нам нужно выбрать всех людей, у кого днюха в данном промежутке, но нам нужно всех поздравлять или только тех, кто старше какого-то возраста? Или нам нужно выбрать всех, кому "за 30" и всех, у кого днюха в данном промежутке...

Автор: Berliner 19.8.2005, 11:10
для Pakshin Нужно:
Код


выбрать всех людей, у кого днюха в данном промежутке


вводим в одно тесковое поле дату с а в другое текстовое поле дату по, по нажатию ктопки чтобы отловило людей у кого день рождения в данном промежутке smile сильно нада- помогите пожалуста



Код

 http://forum.vingrad.ru/index.php?showtopic=61283

для bursa
Спасиб за ссылку но я мало что понял ты можешь мне поджробнее каждую строку кода пояснить(если не трудно) и где там правильный код smile

Автор: bursa 19.8.2005, 15:55
Создаешь вычисляемое поле CalcDay
На обработчике OnCalcField
Цитата(SergeBS @ 17.8.2005, 15:41)

procedure xxx.yyyy.OnCalcField;
begin
CalcDay := FormatDateTime('ddmm', DateFld);
end;
Где-то еще:
FilterStr := FormatDateTime('ddmm', now);


И меняешь

Цитата(bursa @ 19.8.2005, 08:33)

Исправь код SergeBS на CalcDay := FormatDateTime('mmdd', DateFld);
т.е. месяцы вперед.
И фильтруй Query1.Filter:='CalcDay>=+''''+'0106'+''''+ and Query1.Filter<+''''+'0107'+'''';


Месяцы вперед, чтобы,к примеру, 7 января было меньше 3 апреля, т.к.
'0107'<'0403'
а не наоборот
'0701'>'0304'

Автор: Pakshin A. S. 19.8.2005, 16:21
Цитата(Berliner @ 19.8.2005, 12:10)
выбрать всех людей, у кого днюха в данном промежутке


А это что?


Цитата(Pakshin @ 18.8.2005, 16:15)
with query1 do
begin
  Close;
  SQL.Text:='SELECT * FROM "people.db" WHERE BirthDate BETWEEN ''' + Edit1.Text + ''' AND ''' + Edit2.Text + ''';';
  Open;
end;


Выбор только тех полей, где поле находтся в промежутке...

Автор: Berliner 19.8.2005, 19:29

Код

with query1 do
begin
  Close;
  SQL.Text:='SELECT * FROM "people.db" WHERE BirthDate BETWEEN ''' + Edit1.Text + ''' AND ''' + Edit2.Text + ''';';
  Open;
end;



этот код выберет людей которые родились с даты введенной в текстовое поле1 и между датой введенной в текстовое поле2.

ЗАДАЧА ТАКАЯ: ПОЗДРАВИТЬ СОТРУДНИКОВ С ДНЕМ РОЖДЕНИЯ в таблице есть дата рождения. Например, секретарю надо поздравить тех которые родились в августе(ТОЛЬКО В АВГУСТЕ)! Приведенный запрос НЕ ВЫБЕРЕТ Иванова Ивана который родился 14 августа 1965 года (если задать с 01.08.2005) по (31.08.2005)
А если написать в полях с 1.01.1910 по 1.08.2005 года выберет всех которые родились и августе1938 и в апреле 1977 и мае1983 короче всех- из этого промежутка( А ВСЕХ НЕ НАДО НАДО ТЕХ КОТОРЫЕ РОДИЛИСЬ В АВГУСТЕ с 01.08. любого года по 31.08 любого года). Секретарю надо выбрать всех у которых день рождения в периоде ИСПОЛЬЗУЯ ТОЛЬКО ДАТУ И МЕСЯЦ- ИГНОРИРУЯ ГОД.
извините,а теперь понятно?


Добавлено @ 19:38
To bursa
а можно полный код и поподробнее(еще подробнее) как это задача решаема вместе с кодом плиз( правда еще книжку сегодня гляну) и логику( я логику решения задачи не понял) что код делает и сам код полный плиз Извините если достал

Автор: Berliner 19.8.2005, 19:59
P.S. Еще раз коротко для прояснения ситуации

нужно чтобы программа показала кто родился за определенный период, в период будут включаться с "число, месяц" по "число, месяц" , но год -игнорировать. Игнорировать год -сделать период с "число, месяц" по "число,месяц" а года ,чтобы все в условие входили. Т.е. вылавливать -учитывая только дату и месяц рождения

Автор: offline 19.8.2005, 20:24
не знаю как в Парадоксе, а в Аксесе это можно сделать так

Код

SELECT Таблица1.FIO, Str(Dat) AS DenRozhd FROM Таблица1
WHERE Str(Dat) Like "*.12.*"


т.е. пусть секретарь выбирает тоько месяц.
затем берешь пое даты и переводишь в строковую переменную а затем ищешь у кого месяц выбранный секрктадем, в примере декабрь (12) а затем можно уже использовать это поле как дату
АДОЗапрос....ASDate , кажись так. Но это все к Аксесу, не знаю, есть ли в ПАРАДОКСЕ ТАКАЯ ФУНКЦИЯ, НО ДУМАЮ ИДЕЯ ПОНЯТНА smile

поздно увидел твое дополнение касаемое даты. но и дату можно поставить например 23

Код

SELECT Таблица1.FIO, Str(Dat) AS DenRozhd FROM Таблица1
WHERE Str(Dat) Like "23.12.*"

Автор: Berliner 19.8.2005, 22:04
Спасиб а может кто знает как в парадоксе сделать?

Завтра буду пробывать реализоавть идею что написал kirilllius

Автор: Pakshin A. S. 20.8.2005, 08:58
Код

SELECT * FROM Table1 WHERE (EXTRACT(Date FROM BirthDay) BETWEEN Day1 AND Day2) and (EXTRACT(Month FROM BirthDay) BETWEEN Month1 AND Month2);

ТА тот случай, если не попрет вышесказанное...

Автор: Berliner 20.8.2005, 14:37
для Pakshin:

Скажи пожалуста а как тут быть с синтексисом если я хочу чтобы промежуток дат задавался при помощи ввода с полей Edit1 и Edit2 надо в Query в Tparams добавлять :Day1 :Day2 :Month1 :Month2
Поясни плиз что есть что в запросе smile

Автор: Berliner 20.8.2005, 14:55
Извините если я задолбал. Мне сильно надо закончить эту программу smile

Автор: Berliner 20.8.2005, 15:08
пытаюсь....
Вот так не работает smile
Код

SELECT * from "people.db"  
WHERE День_Рождения Str(Dat) Like 'Edit1.Text'%

Автор: offline 20.8.2005, 21:28
очень просто есть ракая функция как DecodeDate(Date,Year,Month,Day) разбивает дату Date на год - Year, месяц - Month и день - Day
вот и все
DecodeDate(StrToDate(Edit1.Text),Year1,Month1,Day1);
DecodeDate(StrToDate(Edit2.Text),Year2,Month2,Day2);

Автор: Berliner 20.8.2005, 22:53
Спасибо только прежде всего у меня SQL запрос не работает

Код

SELECT * from "people.db"  
WHERE День_Рождения Str(Dat) Like 'Edit1.Text'%


Если что то не правильно

как надо?

Автор: offline 20.8.2005, 23:09
тач что, в Парадоксе есть Str()?

Автор: Berliner 20.8.2005, 23:14
Напиши подробнее как надо и что я неправильно делаю

Автор: offline 20.8.2005, 23:19
ну есле там есть Str()

то попробуй так

Код

SELECT * FROM Таблица1
WHERE (((Str([Поле с датой])) Like "*.12.*"))



Код

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Таблица1');
ADOQuery1.SQL.Add('WHERE (((Str([Поле с датой])) = '+ QuotedStr(Edit1.Text) +'))');
ADOQuery1.Open;

Автор: Berliner 20.8.2005, 23:20
Вот кто0нить логику полностью раскрыл и написал что я неправильно делаю

И как надо плиз а если можно то вместе с кодом и пояснити пожалуста что куда ставить пожалуста

Автор: offline 20.8.2005, 23:22
Дай базу на мыло

Автор: Berliner 21.8.2005, 00:20
спаиб мыло напиши а ио форумойскими примочками я плохо пользуюсь я тебе со своего мэйла вышлю

Автор: offline 21.8.2005, 12:26
Код

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * from people.db');
Query1.SQL.Add('WHERE Дата_рождения = "' + Edit1.Text + '"');
Query1.Open;

Автор: Guest 21.8.2005, 12:34
мне надо в текстовое поле чтобы ввести период с и по

а в этом запросе без ПЕРИОДА надо два текстовых попя( с и по)

Автор: Guest 21.8.2005, 12:35
тут типа between нужен

Автор: Berliner 21.8.2005, 12:49
два предыдущих поста были мои

Автор: offline 21.8.2005, 13:22
через две минуты все будет smile

Добавлено @ 13:28
Из справки Paradox
Цитата

Local SQL supports the EXTRACT() function for isolating a single numeric field from a date/time field on retrieval using the following syntax:

EXTRACT (extract_field FROM field_name)

For example, the following statement extracts the year value from a DATE field:

SELECT EXTRACT(YEAR FROM HIRE_DATE)
FROM EMPLOYEE

You can also extract MONTH, DAY, HOUR, MINUTE, and SECOND using this function.

Note: EXTRACT does not support the TIMEZONE_HOUR or TIMEZONE_MINUTE clauses.



Код

procedure TForm1.Button1Click(Sender: TObject);
var
 Year1,Month1,Day1,Year2,Month2,Day2 : Word;
begin
DecodeDate(StrToDate(Edit1.Text),Year1,Month1,Day1);
DecodeDate(StrToDate(Edit2.Text),Year2,Month2,Day2);
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * from people.db');
Query1.SQL.Add('WHERE (EXTRACT(DAY FROM Дата_рождения) BETWEEN ' + IntToStr(Day1) +  ' AND ' + IntToStr(Day2) +')');
Query1.SQL.Add('and (EXTRACT(MONTH FROM Дата_рождения) BETWEEN ' + IntToStr(Month1) +  ' AND ' + IntToStr(Month2) +')');
Query1.Open;
end;


Это опробованно на твоей базе 100% гарантия smile

Автор: Berliner 21.8.2005, 13:39
smile smile smile smile smile Спасибо тебе большое работает!!!!!!!!!
Спасиб что помог!!!!!

Автор: offline 21.8.2005, 13:41
smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)