主页
Top.Mail.Ru Yandeks.Metrika
论坛:“基地”;
当前存档:2002.07.01;
下载:[xml.tar.bz2];

向下

SQL查询 找到类似的分支


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

如何使用“生日”字段(出生日期)从人的腰围中选择60岁以上的人。



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




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

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

从table1中选择*
哪里
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. Насколько я понмню, функция получения текущей даты в ИБ - 今日 (но могу ошибаться)

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.6 MB
时间:0.026 c
3-918
agrig
2002-06-06 19:18
2002.07.01
如何使用Install Shield在BDE中创建我的基础的别名?


1-1013
Neitrimo
2002-06-20 16:51
2002.07.01
DLL中的MDI Child表单(有几个),MDI表单是主要的一个..怎么样?


1-1097
龙卷风
2002-06-19 13:16
2002.07.01
另一个问题......


1-1052

2002-06-16 17:17
2002.07.01
大师,请告诉我 - 我无法理解这种胶水的来源


3-885
Duke2
2002-06-06 21:18
2002.07.01
DBF和Paradox中破坏BLOB的问题





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法文
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日本性玩偶 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 泰米尔人 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский