Задача по MySQL, работа с датой и интервалом
Доброго времени суток всем!
На днях столкнулся с небольшой задачей, которая связана непосредственно с базой данной (MySQL).
Сейчас попробую объяснить суть задачи «на пальцах», которая заставила меня как следует поднапрячь свой мозг!
Предположим, я решил написать мини проект - прокат книг. У меня есть таблица, в которой хранятся данные о каждой книге (с какого и по какое число она была взята).
Смотрите пример ниже:
Нужно написать один MySQL запрос, который выдаст кол-во занятых суток в периодах, которые попадают на интервал даты с 2009-09-05 по 2009-09-15.
В данном случае, запрос должен выдать результат: 3 + 1 + 1 = 5 суток, а не 6 + 2 + 7 = 13 суток.
За сутки мы принимаем разницу в 2 дня (чтобы было понятно).
Эту задачу я решил и хотелось бы узнать другие способы и решения этой как бы несложной задачи. Так же мне хочется посмотреть среди своих знакомых, друзей и коллег, кто на что способен. :)
Отговорки типа «у меня не было времени» или «это проще паренной репы» не принимаются!
В конкурсе на лучший скрипт участвуют только готовые и проверенные решения. Так же можете предложить вариант и с использованием PHP-массивов.
Сначала я даже сам думал применить массивы на PHP.
Удачи!!!
Свой вариант решения выложу чуть позже, дабы не смущать народ!
Читайте ещё похожие статьи на этом сайте:
Если Вам понравилась эта статья, пожалуйста оставьте свой комментарий или подпишитесь на RSS-канал и получайте в будущем статьи на RSS Reader.


Я конечно не очень понял что у тебя там.. но заметив интервалы подумал о 2-ух вешах.
1. BETWEN
2. Group By last_date,new_date,interval
В первом делай селект конкретно по бетвену – чтоб получить все в том интервале ( сложновато но можно )
Во втором группируй и в ПХП просто If Дата новая не соответствует уже дате входа интервала просто выходишь из цикла.
Видать, либо мало спецов по стране, либо всем лень, либо все заняты. Сошлемся на последнее!
Точный запрос не буду вытаскивать, но на начальном уровне он выглядел примерно так:
SELECT bc.b_car_id,
DATE(bc.b_datetime_start), DATE(bc.b_datetime_end), DATEDIFF(DATE(bc.b_datetime_end), DATE(bc.b_datetime_start)) AS diff,
IF(DATE(bc.b_datetime_start)< '2009-09-13' AND DATE(bc.b_datetime_end)>’2009-09-30′, DATEDIFF(’2009-09-30′,’2009-09-13′),
IF(DATE(bc.b_datetime_start)< '2009-09-13', DATEDIFF(DATE(bc.b_datetime_end), DATE(bc.b_datetime_start)) - DATEDIFF('2009-09-13', DATE(bc.b_datetime_start)),
IF(DATE(bc.b_datetime_end)>’2009-09-30′, DATEDIFF(DATE(bc.b_datetime_end), DATE(bc.b_datetime_start)) – DATEDIFF(DATE(bc.b_datetime_end), ’2009-09-30′),
DATEDIFF(DATE(bc.b_datetime_end), DATE(bc.b_datetime_start))
)
)
) AS days
FROM booking_cars AS bc
WHERE bc.b_car_id = 4 AND
(
DATE(bc.b_datetime_end) BETWEEN ’2009-09-13′ AND ’2009-09-30′
OR DATE(bc.b_datetime_start) BETWEEN ’2009-09-13′ AND ’2009-09-30′
)
Возможно код не читабелен, но кто захочет, разберется! )
Мало спецов
Думаю вряд ли хоть кто-нибудь понял твоё решение.