Выбор из таблицы по возрасту

Выбор из таблицы по возрасту

есть таблица пользователей
в ней у каждого пользователя есть дата рождения datebirth ('0000-00-00')

нужно сделать выборку, из таблицы , всех пользователей по возрасту...

я это реализовываю так.

есть у каждого поле age куда я заношу из даты рождения возраст(переодически повторяю процедуру, что бы возраст был правильным...)
потом делаю
SELECT * FROM users WHERE age>18 AND age<30

возможно ли сделать проще? подскажите...
 

Demiurg

Guest
зачем держать дату рождения и возраст в одной таблице ? возраст всегда высчитывается из даты рождения.
 

Demiurg

Guest
>а точнее... интервал от 18 до 30 лет
надо выбрать людей, у которых день рождения больше, чем сегодняшний день минус 18 лет и меньше, чем сегодняшний день плюс 30 лет. В sql сам переведешь ?
 

Cid

...двинутый новичок
.... WHERE age BETWEEN 18 AND 30

18 и 30 меняем на вычисляемые значения
 
Товарищ Cid...
как тут уже сказали age держать в таблице незачем....

меняем на вычисляемые значения
какие значения?

-~{}~ 19.07.04 12:13:

Demiurg
что то не получается.. я правильно понял тебя?
WHERE datebirth>DATE_ADD(CURDATE(), INTERVAL -18 YEAR) AND datebirth<DATE_ADD(CURDATE(), INTERVAL 30 YEAR)
 

Cid

...двинутый новичок
Товарищ nofx - имелось ввиду использование BETWEEN, а не <= или >=
 
а что есть какое-то приемущество для BETWEEN ?
незнал-незнал....
 

Cid

...двинутый новичок
а что есть какое-то приемущество для BETWEEN ?
Кроме более удобочитаемого кода (ну, кому как - я предпочитаю его использовать) - никакого !

There is no difference between the two respective forms apart from the CPU cycles required to rewrite the first one into the second one internally.

the first one - это как раз BETWEEN, а second one - > <
 

Demiurg

Guest
на счет плюсов и минусов я напутал немного. Сам подумай, как правильно.
 
Demiurg :) а я голову ломаю... :) думаю ну как же так... :)
я вообще вот так реализовал

WHERE (YEAR(CURDATE())-YEAR(datebirth)) - (RIGHT(CURDATE(),5)<RIGHT(datebirth,5)) BETWEEN 18 AND 30

Cid видел ? :)
 

Demiurg

Guest
ужас .... не надо работать с датами как со строками, да и индексы тут использоваться не если они есть. Думай еще.
 

Demiurg

Guest
а почему 19 и 31, когда тебе надо 18 и 30 ?
Смотри, если человеку уже есть 18 лет, то день рождения у него был больше, чем 18 лет назад, логично ?
 
интервал от 18 до 30;
дата дня рождения <= чем сегодняшний день минус 18 лет, и >= чем сегодняшний день минус 31 год...

-~{}~ 19.07.04 13:37:

Смотри, если человеку уже есть 18 лет, то день рождения у него был больше, чем 18 лет назад, логично ?
так.. щас разберемся...

допусти есть человеку 18 (дата 1982-10-11)
то день рождения у него меньше чем
2004-07-19 минус 18 лет
тоесть 1986-07-19>1982-10-11

логично?
 

Demiurg

Guest
>логично?
логично, а теперь тоже самое, для "не больше 30 лет"
 
допустим есть человеку 30 (дата 1973-12-12)
то день рождения у него меньше чем
2004-07-19 минус 30 лет
тоесть 1974-07-19 > 1973-12-12

день рождения у него болше чем
2004-07-19 минус 31 год
тоесть 1973-07-19 < 1973-12-12
запас один год, так как может еще не исполнилось ...

логично?
 

Demiurg

Guest
подожди, почему ты в одном случае пишешь больше, в другом меньше? неравенство должно быть одно.
 
Сверху