SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.12.2010 08:01:15

AddMod
Участник
Зарегистрирован: 03.12.2010
Сообщений: 12

Определить количество месяцев...

Здравствуйте! С 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 |                         
+------------+------------+

Может кто подскажет как посчитать эту разницу исходя из этих данных?

Неактивен

 

#2 03.12.2010 11:36:45

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Определить количество месяцев...

Я думаю, что имеется в виду
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));

Неактивен

 

#3 03.12.2010 13:28:52

AddMod
Участник
Зарегистрирован: 03.12.2010
Сообщений: 12

Re: Определить количество месяцев...

Спасибо! А как можно несколько переменных в одной выборке объявить и что бы они не выводились как поля?

Неактивен

 

#4 03.12.2010 14:12:40

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5833

Re: Определить количество месяцев...

AddMod написал:

Спасибо! А как можно несколько переменных в одной выборке объявить

Через запятую @var1:=.., @var2:=..,

AddMod написал:

и что бы они не выводились как поля?

select .. into  http://dev.mysql.com/doc/refman/5.1/en/select.html
или в части from через вспомогательную таблицу или в части where

Вам действительно нужно громоздить всё это одним запросом?

Неактивен

 

#5 03.12.2010 15:00:58

AddMod
Участник
Зарегистрирован: 03.12.2010
Сообщений: 12

Re: Определить количество месяцев...

Но если прописать переменные через запятую, то они будут выполнять одну и ту же функцию:
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-го года...совсем не то, запутался, как данной функции установить параметр что отсчёт нужем именно от конкретной даты и до конкретной даты...

Неактивен

 

#6 03.12.2010 15:11:05

AddMod
Участник
Зарегистрирован: 03.12.2010
Сообщений: 12

Re: Определить количество месяцев...

Если делаю вот так 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)

Неактивен

 

#7 03.12.2010 15:30:59

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5833

Re: Определить количество месяцев...

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()), чтобы соблсти условие задачи.

Неактивен

 

#8 03.12.2010 15:37:32

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Определить количество месяцев...

Очен'  странно.
Посчитайте кол-во месяцев испол'зуя TO_DAYS().

Неактивен

 

#9 03.12.2010 19:01:03

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Определить количество месяцев...

Извините, немного вклинюсь — а мой способ подсчета чем плох?

Неактивен

 

#10 03.12.2010 19:10:05

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5833

Re: Определить количество месяцев...

Насколько я понял, тем, что не использует функцию to_days() wink

Неактивен

 

#11 04.12.2010 11:47:25

AddMod
Участник
Зарегистрирован: 03.12.2010
Сообщений: 12

Re: Определить количество месяцев...

Мне все советы помогли, решил копать, т.к. задание дано именно через 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) 'Извращение big_smile'
          from Student;


Понимаю что извращение, т.к. при рассмотрении функции TO_DAYS возникли следующие вопросы:
1. Как быть с высокосным годом?

2. Как быть с месяцами ведь в них то 30, 31, 28 дней?

использовал окргуление в разные стороны, а точнее подгонка. Вообщем покажу оба примера и объясню что первый куда проще...

Отредактированно AddMod (04.12.2010 12:00:59)

Неактивен

 

#12 04.12.2010 14:20:33

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Определить количество месяцев...

Я могу даже угадать первый вопрос преподавателя: «А DISTINCT зачем?» wink

Неактивен

 

#13 04.12.2010 15:01:53

AddMod
Участник
Зарегистрирован: 03.12.2010
Сообщений: 12

Re: Определить количество месяцев...

paulus написал:

Я могу даже угадать первый вопрос преподавателя: «А DISTINCT зачем?» wink

затем что в базе 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)

Неактивен

 

#14 04.12.2010 17:15:16

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5833

Re: Определить количество месяцев...

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 во втором, чтобы получить результат аналогичный первому, но ... не зачет, думаю, в этом случае обеспечен smile

Неактивен

 

#15 06.12.2010 07:19:55

AddMod
Участник
Зарегистрирован: 03.12.2010
Сообщений: 12

Re: Определить количество месяцев...

Ага понял! Пасиб! Прочитал только сегодня, сообщение
"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);"
не надо указывать таблицу, если она есть во вложенных выборках.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson