Форум: "Базы";
Текущий архив: 2002.07.01;
Скачать: [xml.tar.bz2];
ВнизSQL запрос Найти похожие ветки
← →
Proton (2002-05-25 23:59) [0]как выбрать из талицы People людей старше 60 лет используя поле BirthDay (дата рожденья).
← →
Proton (2002-05-25 23:59) [1]???
← →
kaif (2002-05-26 02:28) [2]Только 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-26 13:56) [3]2kaif - во первых - спасибо ...
твой запорос можно упростить -
дело в том что если вычитать из одной даты другую
то резельтатом будет количество дней
т.е.
SELECT * WHERE (NOW - BIRTHDAY) > (365*60)
вот только на NOW он ругется хотя Dialect 3
мне тут светлые умы говорят что NOW вроде в какие то ковычки надо брать, или что то в этом роде - ты ни чего об этом не знаеш.
Да на високосный год можно плюнуть - а то он сильно усложнит нашу проблемму.
← →
Макз (2002-05-26 15:03) [4]current_date вместо NOW сдесь будет лучше смотреться
← →
Proton (2002-05-26 17:10) [5]
> current_date
спасибо уже нашел
А в SQL кааие ни будь функции округления есть ?
мне надо что то вроде
SELECT * WHERE (NOW - BIRTHDAY) > TRUNC(365.25*60)
Что нибудь что б дробную часть отрезало или округляло
trunc или round
← →
Proton (2002-05-26 17:12) [6]TRUNC я вставил по аналогии с delphi - не поймите превратно.
← →
kaif (2002-05-27 02:17) [7]Суть моего варианта в том, чтобы
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-27 10:06) [8]
> Суть моего варианта в том, чтобы
> 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. Конечно это все равно не точно но тем не менее.
> Зачем округлять? Я думаю, и так сработает.
Ты прав даже если не округлять то все равно считает почни нормально
← →
DmitryK (2002-05-27 12:34) [9]1. IB не знаю, а в MSSQL есть специальная функция для суммирования дат, в которой надо указать в каких единицах идет отсчет (например в годах) и прибавляемое значение, возможно и здесь есть что то такое.
2. Насколько я понмню, функция получения текущей даты в ИБ - today (но могу ошибаться)
3. выражение (NOW - BIRTHDAY) > (365.25*60) лучше строить таким образом BIRTHDAY < (NOW - 365.25*60) - это позволит использовать индексы для ускорения поиска
4. Если в ИБ все-таки нет возможности так просто рассчитывать даты, то это можно всегда решить через преобразования к другим типам, но в таком случае рекомендую воспользоваться след. схемой:
- объявляешь переменную типа дата
- рассчитываешь значение и заносишь в эту переменную
- и только потом делаешь выборку
это тоже позволит ускорить обработку.
← →
kaif (2002-05-27 13:30) [10]DmitryK прав.
BIRTHDAY < (NOW - 365.25*60) позволит использовать индексы.
Можно вообще сделать BIRTHDAY < :BIRTHDAY
и передавать уже заранее вычисленную (на клиенте) константу BIRTHDAY
в качестве параметра в запрос (если, конечно, нужно именно на какую-то одну дату выяснять). Тогда все будет точно и быстро.
← →
Proton (2002-06-09 16:54) [11]
> DmitryK прав.
> BIRTHDAY < (NOW - 365.25*60) позволит использовать индексы.
Сам вижу что прав.
> Можно вообще сделать BIRTHDAY < :BIRTHDAY
> и передавать уже заранее вычисленную (на клиенте) константу
> BIRTHDAY
> в качестве параметра в запрос (если, конечно, нужно именно
> на какую-то одну дату выяснять). Тогда все будет точно и
> быстро.
Только вот одно но ! IB в строке сабжа значит InterBase - я это в свою очередь клиент сервер, а это в свою очередь что дату нуно брать с сервера - а такой расклад меня не устраивает - тк прямого дступа к серверу я не имею. Думаю что не имеют даже админы кот его обслуживают. Он наверное в сейфе где нить стоит.
:)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.07.01;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c