Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.01;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.01 c
14-1159
sunwheel
2002-05-29 18:41
2002.07.01
Натягивание картинки на таблицу (HTML)


14-1184
Sejatel
2002-05-27 04:08
2002.07.01
Не


3-930
KashDi
2002-06-10 09:21
2002.07.01
delphi6, MSSQL


3-866
Demon Ltd
2002-06-04 23:03
2002.07.01
связать базу с TreeView


14-1150
vopros
2002-05-27 15:26
2002.07.01
Кто из Питера АУУУ?Намек поняли?