Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2008, 15:51   #1
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
Вопрос Находжение разницы годов в SQL запросе

Здравствуйте! Подскажите пожалуйста.
Задача: Посчитать кол-во записей в БД (Paradox), где все мужчины старше 60 лет.
SQL-запрос такой:
begin
Код:
mQ.Close;
mQ.SQL.Clear;
mQ.SQL.Add('SELECT COUNT(*) FROM Base.db WHERE (SEX LIKE "Мужской") AND (...[подсчет разницы в годах между двумя датами]...)');
mQ.Open;
Одна дата берется из базы (поле BIRTHDAY), вторая - текущая дата.
Как мне это реализовать в запросе??? (ну никак не придумаю)

P.S. Наиболее оптимальный вариант с фун-ей YearsBetween!!!
Но нак её в запрос впихнуть ?????
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 24.02.2008, 16:10   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Вот такое есть в Парадоксе?:

.........AND ( (YEAR(NOW()) - YEAR(BIRTHDAY)) > 60 )...........
B_N вне форума Ответить с цитированием
Старый 24.02.2008, 16:50   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Ну, по-моему, самое простое - отсчитать 60 лет от текущей даты, получить результат RESULT и вставить в запрос: '... and birthday<='+IntToStr(result)...'
Зачем пытаться произвести вычисления в SQL-запросе?
mihali4 вне форума Ответить с цитированием
Старый 25.02.2008, 10:24   #4
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Цитата:
Сообщение от mihali4
Зачем пытаться произвести вычисления в SQL-запросе?
А как я буду перебирать каждую запись по очереди. Мне же нужно не одну запись провести а перебрать всю базу!
Если несложно - можно примерчик!!!
Спасибо!
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 26.02.2008, 01:42   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от Yurk@ Посмотреть сообщение
А как я буду перебирать каждую запись по очереди. Мне же нужно не одну запись провести а перебрать всю базу!
Если несложно - можно примерчик!!!
Спасибо!
Какой еще "примерчик"???
Я вам дал готовую фразу для вставки в ваш запрос:
Цитата:
вставить в запрос: '... and birthday<='+DateToStr(result)...'
З.Ы. А-а-а... Понял... Простите... Ну вот:
Код:
Result: TDateTime;// глобальная или выходная (если в виде функции оформите)
...

var: y,m,d: integer;
begin
...
DecodeDate(Now,y,m,d);
Result:=EncodeDate(y-60,m,d);
...
end;

Последний раз редактировалось mihali4; 26.02.2008 в 13:59.
mihali4 вне форума Ответить с цитированием
Старый 26.02.2008, 09:26   #6
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

mihali4, спасибо!
Я уже решил эту проблему немножко другим путем, но с тем же смыслом.
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 26.02.2008, 22:56   #7
Pitbull
детский тренер
Форумчанин
 
Аватар для Pitbull
 
Регистрация: 08.06.2007
Сообщений: 532
По умолчанию

в MSSQL есть функции GetDate() - получение текущей даты, month(дата), year(дата).... Вот ими и можно пользоваться...
к дате рождения прибавляешь 60 и сравниваешь с сегодняшней....
Я злой и страФный серррый воФк, и в пАрАсятах знаю толк - ppp ppp pp p pp pp
Pitbull вне форума Ответить с цитированием
Старый 27.02.2008, 09:53   #8
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Кто нить может скинуть пример (желательно для конкретного случая) функции DATEDIFF ???
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 27.02.2008 в 09:55.
Yurk@ вне форума Ответить с цитированием
Старый 27.02.2008, 18:56   #9
Domovoy
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 254
По умолчанию

SELECT DATEDIFF(day, '08.01.2008', '08.25.2008') AS diffDay --24
Domovoy вне форума Ответить с цитированием
Старый 29.02.2008, 09:49   #10
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Цитата:
Сообщение от Domovoy
Код:
SELECT DATEDIFF(day, '08.01.2008', '08.25.2008') AS diffDay --24
Не катит! Пишет: Capability not supported
ЗЫ: Расшифруй строку: AS diffDay --24

Цитата:
Сообщение от mihali4
Зачем пытаться произвести вычисления в SQL-запросе?
Терь такая же проблема, только нужно выбрать всех, у кого дата поступления и выписки меньше 2 дней. Оба поля (тип: DATE) беруться из базы.
Нужно как-то произвести вычисления в самом запросе.

Запрос такого типа:
Код:
Q.Close;
Q.SQL.Clear;
Q.SQL.Add('SELECT * FROM Base.db WHERE DATEDIFF(dd, FIELD1, FIELD3) <= "2" ');
Q.Open;
Но он не катит!
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 29.02.2008 в 09:52.
Yurk@ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ковычки в SQL запросе XPAiN БД в Delphi 13 22.02.2008 13:36
автоинкремент в запросе ГОСЕАН БД в Delphi 13 01.02.2008 16:12
Ошибка SQL запросе. EVG44 БД в Delphi 2 21.10.2007 22:42
Ошибка при запросе SQL в IB Алекс1 БД в Delphi 2 24.06.2007 22:37