Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте! С mysql работаю/изучаю всего неделю (а точнее 4-5 полных дней), попалось задание в лаб-ой работе с которым у меня возникли сложности, не вижу как связать правильно что бы получить нужный результат.
Задание в следующем:
Определить количество месяцев между датами рождения первого и последнего в списке студентов (в таблице student). Даты определить дополнительными запросами, используя поле student_id (функция TO_DAYS и встроенное присваивание вида @var:=выражение).
Как пользоваться этими функциями по отдельности знаю, вот связать их не могу.
Вот выборка по конкретному условию: select student_id, birthday from Student where student_id=1 or student_id=44;
+------------+------------+
| student_id | birthday |
+------------+------------+
| 1 | 1976-05-03 |
| 44 | 1982-07-15 |
+------------+------------+
Может кто подскажет как посчитать эту разницу исходя из этих данных?
Неактивен
Я думаю, что имеется в виду
SELECT @stu1 := birthday FROM Student WHERE student_id = 1;
SELECT @stu2 := birthday FROM Student WHERE student_id = 44;
Собственно, сама задачка заключается в том, чтобы определить количество
месяцев. В качестве точки отсчета можете взять, например,
SELECT (YEAR(@stu2) - YEAR(@stu1)) * 12 + (MONTH(@stu2) - MONTH(@stu1));
Неактивен
Спасибо! А как можно несколько переменных в одной выборке объявить и что бы они не выводились как поля?
Неактивен
AddMod написал:
Спасибо! А как можно несколько переменных в одной выборке объявить
Через запятую @var1:=.., @var2:=..,
AddMod написал:
и что бы они не выводились как поля?
select .. into http://dev.mysql.com/doc/refman/5.1/en/select.html
или в части from через вспомогательную таблицу или в части where
Вам действительно нужно громоздить всё это одним запросом?
Неактивен
Но если прописать переменные через запятую, то они будут выполнять одну и ту же функцию:
select @stu1:=birthday, @stu2:=birthday from Student where student_id=1 or student_id=44;
+-----------------+-----------------+
| @stu1:=birthday | @stu2:=birthday |
+-----------------+-----------------+
| 1976-05-03 | 1976-05-03 |
| 1982-07-15 | 1982-07-15 |
+-----------------+-----------------+
и как тогда вычислить разность в месяцах при помощи именно TO_DAYS (от условия нельзя отступать)
при этом "select @stu1:=birthday, TO_DAYS(@stu1) from Student where student_id=1 or student_id=44;" будет:
+-----------------+----------------+
| @stu1:=birthday | TO_DAYS(@stu1) |
+-----------------+----------------+
| 1976-05-03 | 721842 |
| 1982-07-15 | 724106 |
+-----------------+----------------+
Но это в днях и отсчёт от 0-го года...совсем не то, запутался, как данной функции установить параметр что отсчёт нужем именно от конкретной даты и до конкретной даты...
Неактивен
Если делаю вот так select @stu1:=birthday, TO_DAYS(NOW())-TO_DAYS(@stu1) from Student where student_id=1;
то:
+-----------------+-------------------------------+
| @stu1:=birthday | TO_DAYS(NOW())-TO_DAYS(@stu1) |
+-----------------+-------------------------------+
| 1976-05-03 | 12632 |
+-----------------+-------------------------------+
т.е. выполняет что надо, но как заставить высчитать разницу из двух переменных по полям student_id и потом перевести это в месяцы...
Отредактированно AddMod (03.12.2010 15:11:38)
Неактивен
AddMod написал:
Но если прописать переменные через запятую, то они будут выполнять одну и ту же функцию:
select @stu1:=birthday, @stu2:=birthday from Student where student_id=1 or student_id=44;
Например:
select (select @stu1:=birthday from Student where student_id=1), (select @stu2:=birthday from Student where student_id=44);
Вото только зачем, если в исходном сообщении вы написали
AddMod написал:
Даты определить дополнительными запросами
AddMod написал:
Но это в днях и отсчёт от 0-го года...совсем не то, запутался, как данной функции установить параметр что отсчёт нужем именно от конкретной даты и до конкретной даты...
Никак.
http://dev.mysql.com/doc/refman/5.1/en/ … on_to-days
Используя to_days() вы можете получить разницу в днях между датами рождения. А вот однозначно перевести это в месяцы...
Можно, конечно, использовать разные конструкции типа from_days(TO_DAYS()), чтобы соблсти условие задачи.
Неактивен
Очен' странно.
Посчитайте кол-во месяцев испол'зуя TO_DAYS().
Неактивен
Извините, немного вклинюсь — а мой способ подсчета чем плох?
Неактивен
Насколько я понял, тем, что не использует функцию to_days()
Неактивен
Мне все советы помогли, решил копать, т.к. задание дано именно через TO_DAYS, но посмотрев этот вариант "SELECT (YEAR(@stu2) - YEAR(@stu1)) * 12 + (MONTH(@stu2) - MONTH(@stu1));" согласился, что TO_DAYS не нужен, но раз надо так надо...
Сделал следующим образом:
select DISTINCT (select @stu1:=birthday from Student where student_id=1) '1',
(select @stu2:=birthday from Student where student_id=44) '2',
ROUND(CEILING((TO_DAYS(@stu2) - To_DAYS(@stu1))/31)/31) 'Извращение '
from Student;
Понимаю что извращение, т.к. при рассмотрении функции TO_DAYS возникли следующие вопросы:
1. Как быть с высокосным годом?
2. Как быть с месяцами ведь в них то 30, 31, 28 дней?
использовал окргуление в разные стороны, а точнее подгонка. Вообщем покажу оба примера и объясню что первый куда проще...
Отредактированно AddMod (04.12.2010 12:00:59)
Неактивен
Я могу даже угадать первый вопрос преподавателя: «А DISTINCT зачем?»
Неактивен
paulus написал:
Я могу даже угадать первый вопрос преподавателя: «А DISTINCT зачем?»
затем что в базе 44 студента и если без DISTINCT вписать эти выборки то выводит он почему то 44 одинкаовых значения для каждого select'a.
Может подскажите как это обойти?)
если запрос такой "select student_id, birthday from Student where student_id=1 or student_id=44;"
то всё хорошо, а если такой
"select (select @stu1:=birthday fromStudentwherestudent_id=1) '1'(select@stu2:=birthday from Student where student_id=44) '2' from Student;"
то выодит 44 одинаковых даты для обоих полей.
+------------+------------+
| 1 | 2 |
+------------+------------+
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
| 1976-05-03 | 1982-07-15 |
+------------+------------+
Отредактированно AddMod (04.12.2010 15:03:00)
Неактивен
AddMod написал:
а если такой
"select (select @stu1:=birthday fromStudentwherestudent_id=1) '1'(select@stu2:=birthday from Student where student_id=44) '2' from Student;"
то выодит 44 одинаковых даты для обоих полей.
Оцените разницу в выполнении следующих запросов:
select 1;
select 1 from Student;
Конечно, можно громоздить distinct во втором, чтобы получить результат аналогичный первому, но ... не зачет, думаю, в этом случае обеспечен
Неактивен
Ага понял! Пасиб! Прочитал только сегодня, сообщение
"mysql> select (select @stu1:=birthday from Student where student_id=1) '1', (select @stu2:=birthday from Student where student_id=44) '2', ROUND(CEILING((TO_DAYS(@stu2) - To_DAYS(@stu1))/31)/31);"
не надо указывать таблицу, если она есть во вложенных выборках.
Неактивен