Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-911
NNH
2002-06-06 21:36
2002.07.01
DBTChart


1-1037
ef2000
2002-06-18 16:35
2002.07.01
Помогите, плиз!


14-1180
VID
2002-05-30 17:55
2002.07.01
Листок заказов на UBPFD.


1-1093
Aleksandr
2002-06-19 12:25
2002.07.01
Расскажите подробнее о Coinitialize(nil)


1-1024
Freezer
2002-06-18 12:44
2002.07.01
Pointe To PChar?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский