Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Не правильно высчитывает год... (http://forum.oszone.net/showthread.php?t=104895)

stone_wings 13-04-2008 02:31 780429

Не правильно высчитывает год...
 
Вот собсно ковырял манку (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 780468

В чём проблема-то? Тот, кто родился в декабре 1997 года сейчас десятилетний.

stone_wings 13-04-2008 11:24 780518

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

rus-4-ever 14-04-2008 22:20 781416

попробуй так:
mysql> select name, birth, curdate(), (left(curdate(),4) - left(birth,4)) as age from pet;

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

stone_wings 14-04-2008 23:07 781444

2rus-4-ever ^_^ СПС

И ещё.. Обьясните плз значение выражения
Цитата:

Цитата stone_wings
...(right(curdate(),5)<right(birth,5)) »

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

rus-4-ever 15-04-2008 00:41 781501

Смари...

(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 781504

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

rus-4-ever 15-04-2008 01:09 781510

ну да!!!
true==1 !!!
false==0 !!!

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

stone_wings 15-04-2008 01:36 781518

Это как в КВНе...
"Да идите вы.... "
"Не, ну интуитивно я предпологаю куда... Но хотелось бы уточнить...."

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


Время: 13:33.

Время: 13:33.
© OSzone.net 2001-