![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
letsgo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 17.2.2009 Репутация: нет Всего: нет |
Проблема, описанная в этом посте решена, но теперь задача усложнилась и требуется ваша помощь (в этом же топике). Буду благодарен! Заранее всем спасибо!
Есть таблица, которая содержит информацию о тарифах. Структура таблица id - Порядковый номер записи idtariff - ID тарифа date_start - дата начала действия тарифа в UNIX формате date_finish - дата окончания действия тарифа в UNIX формате price - Величина тарифа в указанный период К примеру есть следующие записи
Т.е. с 01.05.2010 по 15.05.2010 величина тарифа с ID = 5 равняется 20 в день, а с 16.05.2010 по 31.05.2010 равняется 25 в день Допустим, мне необходимо получить информацию о стоимости тарифа с 02.05.2010 по 07.05.2010. Здесь всё просто: SELECT `price` FROM `table` WHERE `date_start` <= '1272744000' AND `date_finish` >= '1273176000' Полученное значение умножаем на количество суток в нашем случае 5 и все довольны. А что делать, когда нам необходимо подсчитать стоимость тарифа с 02.05.2010 по 25.05.2010. Сейчас, я веду эти подсчёты с помощью цикла. Т.е. беру первую дату 02.05.2010 (1272744000) и ищу стоимость по ней, затем беру следующую дату 03.05.2010 и прибавляю к предыдущей и так далее до даты равной 25.05.2010. Получается на один подсчёт уходит более 20 запросок к БД. Считаю, что делаю очень неправильно, поэтому, хотелось бы проконсультироваться. Спасибо. Это сообщение отредактировал(а) letsgo - 27.7.2010, 13:08 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
я не совсем понял задачу, у меня подозрение на неправильную архитектуру, но твоя задача (то, что описано) решается просто
date_finish - date_start = разница в секундах date_finish - date_start / 60 / 60 / 24 = количество суток в первом случае (1273176000 - 1272744000) / 60 / 60 / 24 = 5 тоже самое во втором случае. и к PHP вопрос не имеет никакого отношения. а вообще есть куча функций для работы с датой и временем (типа date_diff), смотри в manual-ах своей СУБД. Это сообщение отредактировал(а) azesmcar - 24.3.2010, 10:54 |
|||
|
||||
letsgo |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 17.2.2009 Репутация: нет Всего: нет |
Опишу может чуть подробнее. В каждой строке таблицы хранится запись о величине тарифа в конкретном периоде. Т.е. в первой строке, указано, что с 1 мая по 15 мая тариф равняется 20 в день, во второй строке, что с 16 мая по 31 мая тариф == 25. Если мне нужно узнать стоимость тарифа со 2 мая по 7 мая. Я знаю, как это сделать одним запросом, потому что использоваться будет только одна строка. Если же мне нужно узнать величину тарифа со 2 мая по 17 мая, я не могу это сделать одним запросом ( ![]() Может с моей стороны будет наглостью, но хотелось бы получить конкретный вид запроса, т.е. сколько будет составлять тариф с 02.05.2010 (1272744000) по 17.05.2010 (1274126399). Сейчас я это делаю следующим образом
Да. Извиняюсь. Уже забыл, что здесь есть раздел для подобных вопросов. Это сообщение отредактировал(а) letsgo - 24.3.2010, 11:44 |
||||||
|
|||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
letsgo
Если там две строки, то и цены могут быть разные, в таком случае нужна итерация по каждой строке..или мне не совсем понятно. Если цена та же самая (тогда зачем нужны две идентичные строки?) - тогда группируй по idtariff. Это сообщение отредактировал(а) azesmcar - 24.3.2010, 11:43 |
|||
|
||||
letsgo |
|
||||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 17.2.2009 Репутация: нет Всего: нет |
Я отредактировал сообщение, добавил код, с помощью которого сейчас ведётся подсчет. Т.е., сейчас я выбираю величину тарифа для каждого дня. Если нам нужно подсчитать для 7 дней, делаем 6 запросов, нужно 17 дней делаем 16 запросов. И при каждом запросе увеличиваем переменную $date_start на 86400 секунд (т.е. на 1 сутки)
Да. одна строка = один период = одна цена, следующая строка уже другой период и другая цена соответственно Это сообщение отредактировал(а) letsgo - 24.3.2010, 11:50 |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
letsgo
ок. кажется понял. Добавлено через 7 минут и 9 секунд дай структуру таблицы и тестовые данные Это сообщение отредактировал(а) azesmcar - 24.3.2010, 11:59 |
|||
|
||||
letsgo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 17.2.2009 Репутация: нет Всего: нет |
Это сообщение отредактировал(а) letsgo - 24.3.2010, 12:21 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
а данные где?
|
|||
|
||||
letsgo |
|
||||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 17.2.2009 Репутация: нет Всего: нет |
Извиняюсь. Задержка вышла. 7 периодов по тарифу с ID=1, начиная с 01.05.2010. Все по 15 дней, но это случайно. Период идёт в следующем виде: НачалоПериода (01.05.2010 00:00) - КонецПериода (15.05.2010 23:59) Это сообщение отредактировал(а) letsgo - 24.3.2010, 13:01 |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
letsgo
Сейчас времени нет долго ковыряться, написать можно с помощью SQL, предлагаю обойтись банальной оптимизацией цикла, т.е. сперва получить все тарифы для 16 дней а потом делать итерация по ним а не каждый раз запрашивать данные на 1 день. |
|||
|
||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 3 Всего: 42 |
Так чему же будет равен тариф, если до 15го было 20, а с 16го стало 25? По какой формуле считается-то? -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 1 Всего: 211 |
||||
|
||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 3 Всего: 42 |
Тогда считается не тариф, а сумма оплаты.
А это элементарно
Все. В итоге у нас цена и число дней когда эта цена действовала. Можно там же в запросе их перемножить и просуммировать. -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
letsgo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 17.2.2009 Репутация: нет Всего: нет |
Извиняюсь, а можно поподробнее, что это за "остальные 3 случая". Буду благодарен |
|||
|
||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 3 Всего: 42 |
А логику применить? Есть четыре варианта. Период может попасть в промежуток дат
Вариант когда период не попадает в промежуток дат отсеивается еще в WHERE (кстати там ошибка, его надо дополнить, чтобы брались данные и для 4го случая) -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |