Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL запрос [D5, D6, IB5.x, IB6.x, FIBplus]


Proton ©   (2002-05-25 23:59:00) 

как выбрать из талицы People людей старше 60 лет используя поле BirthDay (дата рожденья).


Proton   (2002-06-09 16:54:00) [1]


> DmitryK прав.
> BIRTHDAY < (NOW - 365.25*60) позволит использовать индексы.

Сам вижу что прав.

> Можно вообще сделать BIRTHDAY < :BIRTHDAY
> и передавать уже заранее вычисленную (на клиенте) константу
> BIRTHDAY
> в качестве параметра в запрос (если, конечно, нужно именно
> на какую-то одну дату выяснять). Тогда все будет точно и
> быстро.

Только вот одно но ! IB в строке сабжа значит InterBase - я это в свою очередь клиент сервер, а это в свою очередь что дату нуно брать с сервера - а такой расклад меня не устраивает - тк прямого дступа к серверу я не имею. Думаю что не имеют даже админы кот его обслуживают. Он наверное в сейфе где нить стоит.
:)


kaif   (2002-05-27 13:30:00) [2]

DmitryK прав.
BIRTHDAY < (NOW - 365.25*60) позволит использовать индексы.
Можно вообще сделать BIRTHDAY < :BIRTHDAY
и передавать уже заранее вычисленную (на клиенте) константу BIRTHDAY
в качестве параметра в запрос (если, конечно, нужно именно на какую-то одну дату выяснять). Тогда все будет точно и быстро.


DmitryK   (2002-05-27 12:34:00) [3]

1. IB не знаю, а в MSSQL есть специальная функция для суммирования дат, в которой надо указать в каких единицах идет отсчет (например в годах) и прибавляемое значение, возможно и здесь есть что то такое.

2. Насколько я понмню, функция получения текущей даты в ИБ - today(но могу ошибаться)

3. выражение (NOW - BIRTHDAY) > (365.25*60)лучше строить таким образом BIRTHDAY < (NOW - 365.25*60)- это позволит использовать индексы для ускорения поиска

4. Если в ИБ все-таки нет возможности так просто рассчитывать даты, то это можно всегда решить через преобразования к другим типам, но в таком случае рекомендую воспользоваться след. схемой:
- объявляешь переменную типа дата
- рассчитываешь значение и заносишь в эту переменную
- и только потом делаешь выборку

это тоже позволит ускорить обработку.



Proton   (2002-05-27 10:06:00) [4]


> Суть моего варианта в том, чтобы
> 1. извлечь год из даты рождения (extract(year from birthday))
> 2. собрать день рождения в этом году типа YYYY-MM-DD
> 3. посмотреть, отпразднован ли он в этом году, сравнив с
> NOW.
Не все так просто как ты думеш.
Так вот мне приходится еще кучу условий подлепливать к этому запросу. Запрос и так слишком большой. А его еще оптимизировать нужно будет :)
> Видимо, NOW надо в кавычках "NOW" (не помню).
Вместо NOW - надо юзать DATE_CURRENT
> Однако, я чувствую, что может быть ошибка для лиц с днем
> рождения 29 февраля, так как, возможно, дату 2002-02-29
> сервер просто не примет, сказав, что такой даты нет.
> Однако, я вообще не знаю, как считать возраст для таких
> лиц.
> -------
> Если же тебя устраивает простое решение, то можно, действительно:
> (NOW - BIRTHDAY) > (365.25*60)
А что касается округления то посмотри - если не округлять а отрезать дробную часть то на каждый четвертый год будет добавляться 1. Конечно это все равно не точно но тем не менее.
> Зачем округлять? Я думаю, и так сработает.
Ты прав даже если не округлять то все равно считает почни нормально


kaif   (2002-05-27 02:17:00) [5]

Суть моего варианта в том, чтобы
1. извлечь год из даты рождения (extract(year from birthday))
2. собрать день рождения в этом году типа YYYY-MM-DD
3. посмотреть, отпразднован ли он в этом году, сравнив с NOW.
Видимо, NOW надо в кавычках "NOW" (не помню).
Однако, я чувствую, что может быть ошибка для лиц с днем рождения 29 февраля, так как, возможно, дату 2002-02-29 сервер просто не примет, сказав, что такой даты нет.
Однако, я вообще не знаю, как считать возраст для таких лиц.
-------
Если же тебя устраивает простое решение, то можно, действительно:
(NOW - BIRTHDAY) > (365.25*60)
Зачем округлять? Я думаю, и так сработает.


Proton   (2002-05-26 17:12:00) [6]

TRUNC я вставил по аналогии с delphi - не поймите превратно.


Proton   (2002-05-26 17:10:00) [7]


> current_date

спасибо уже нашел

А в SQL кааие ни будь функции округления есть ?
мне надо что то вроде
SELECT * WHERE (NOW - BIRTHDAY) > TRUNC(365.25*60)
Что нибудь что б дробную часть отрезало или округляло
trunc или round


Макз   (2002-05-26 15:03:00) [8]

current_date вместо NOW сдесь будет лучше смотреться


Proton   (2002-05-26 13:56:00) [9]

2kaif - во первых - спасибо ...
твой запорос можно упростить -
дело в том что если вычитать из одной даты другую
то резельтатом будет количество дней
т.е.
SELECT * WHERE (NOW - BIRTHDAY) > (365*60)
вот только на NOW он ругетсяхотя Dialect 3
мне тут светлые умы говорят что NOW вроде в какие то ковычки надо брать, или что то в этом роде - ты ни чего об этом не знаеш.
Да на високосный год можно плюнуть - а то он сильно усложнит нашу проблемму.


kaif   (2002-05-26 02:28:00) [10]

Только SQL dialect 3 (IB6.0)

select * from table1
where
now >=
cast(
cast(
extract(year from BirthDay)+60 as char(4)
)
||"-"||
extract(month from BirthDay)
||"-"||
extract(day from BirthDay)
as DATE)


Proton   (2002-05-25 23:59:00) [11]

???


Наверх

Титульная страница Поиск, карта сайта Написать письмо