Войти

Показать полную графическую версию : [решено] Не правильно высчитывает год...


stone_wings
13-04-2008, 02:31
Вот собсно ковырял манку (MySql) 5.0 решил попробывать..
mysql> select name, birth, curdate(), (year(curdate())-year(birth)) - (right(curdate(),5)<right(birth,5)) as age from pet;
Но... Почему то заместь 11ти лет показует 10ть... Учитывая что, как бы, выбираем только по году.... В общем кто знает, прокоментируйте плз.
+--------- ----+----------------+----------- ---+------+
| name | birth | curdate() | age |
+--------------+----------------+---------------+------+
| Whistler_3 | 1997-12-09 | 2008-04-13 | 10 |
| Whistler_3 | 1997-12-10 | 2008-04-13 | 10 |
| Whistler_3 | 1997-12-10 | 2008-04-13 | 10 |
| Whistler_2 | 1997-12-09 | 2008-04-13 | 10 |
| Whistler_2 | 1997-12-09 | 2008-04-13 | 10 |
| Whistler_2 | 1997-12-11 | 2008-04-13 | 10 |
| Whistler_2 | 1997-12-09 | 2008-04-13 | 10 |
| Whistler_1 | 1997-12-11 | 2008-04-13 | 10 |
| Whistler_1 | 1997-12-09 | 2008-04-13 | 10 |
| Whistler_1 | 1997-12-11 | 2008-04-13 | 10 |
| Whistler_1 | 1997-12-09 | 2008-04-13 | 10 |
+----------- --+----------------+---------------+------+

Coutty
13-04-2008, 07:43
В чём проблема-то? Тот, кто родился в декабре 1997 года сейчас десятилетний.

stone_wings
13-04-2008, 11:24
Проблема в том, что я не могу понять почему 10ть лет. Ведь месяцы не трогаем, а считаем только по годам... А если считать только года то 2008 минус 1997 ну никак 10ть не получается.. =/

rus-4-ever
14-04-2008, 22:20
попробуй так:
mysql> select name, birth, curdate(), (left(curdate(),4) - left(birth,4)) as age from pet;

Должно сработать =) и красивее смотриццо =)

stone_wings
14-04-2008, 23:07
2rus-4-ever ^_^ СПС

И ещё.. Обьясните плз значение выражения ...(right(curdate(),5)<right(birth,5)) »
Как я понимаю из "текущей даты" берутся пять правых цыфр, а из столбца "birth" берутся тоже 5ть правых цыфр, и что дальше? Они сравниваются? Вот эта часть мне и не понятна, т.к. именно это выражение и "высчитывало правильно", учитывает месяца...

rus-4-ever
15-04-2008, 00:41
Смари...

(year(curdate())-year(birth)) - (right(curdate(),5)<right(birth,5))

Разобьём на 2 выражения

1)(year(curdate())-year(birth)) - вычисляет сколько лет прошло (не учитывая месяцы)...

2)(right(curdate(),5)<right(birth,5)) - логическое выражение.. если текущая дата меньше чем дата рождения, то вычитается единица

stone_wings
15-04-2008, 00:47
Хм... Отсюда следует что если условие "<" выполняется то значение в скобках будет единицей, иначе ноль.. Так? :)
ЗЫ: Просто не понимаю откуда у нас появляется эта единица. Если б было написано " - 1".. Тады чего там думать и так всё понятно.. :)

rus-4-ever
15-04-2008, 01:09
ну да!!!
true==1 !!!
false==0 !!!

Это логическое выражение... сокращённый вид...

stone_wings
15-04-2008, 01:36
Это как в КВНе...
"Да идите вы.... "
"Не, ну интуитивно я предпологаю куда... Но хотелось бы уточнить...."

ЗЫ: Спс за разьяснения. ^_^




© OSzone.net 2001-2012