Форум → Разработка → Базы данных → Вопрос по запросу
Вопрос по запросу
-
Доброго всем дня!
суть вопроса: Есть дата начала предоставления услуги, она может еще не наступила и есть дата окончания предоставления услуги (ее может и не быть). Необходимо сделать начисление за услуги за предыдущий месяц, даже если процесс начисления начался не 1 числа, предположим 10 числа. Также еще условие что если дата окончания (если вдруг она есть) попадала в расчетный период. -
Апрель 4, 2012, 12:28 п.п., спустя 31 минуту 24 секунды
Какие запросы у вас получились?https://smappi.org/ - платформа по созданию API на все случаи жизни -
Апрель 4, 2012, 12:36 п.п., спустя 7 минут 21 секунду
если ты опишешь условия математически, никаких сложностей с переложением на SQL не возникнет. начисление это тариф * дни
значит требуется посчитать разницу в днях между двумя датами. псевдокод:
min(nvl(service.end, today), this_month_1st) - max(service.begin, last_month_1st)
здесь nvl(service.end, today) означает, что если service.end is null, то используем today
конкретные функции зависят от диалекта SQL. они у всех разныеιιlllιlllι унц-унц -
Апрель 4, 2012, 1:11 п.п., спустя 35 минут 2 секунды
Какие запросы у вас получились?SELECT *
FROM customer_service
INNER JOIN tariffs ON tariffs.id = customer_service.tariffs
WHERE (
`datepicker1` <= now( ) - INTERVAL 1
DAY
)
AND (
end_date IS NULL
OR end_date >= now( ) -
Апрель 4, 2012, 2:08 п.п., спустя 57 минут 15 секунд
Также еще условие что если дата окончания попадала в расчетный период.
Что касается незаконченных предложений.не всё полезно, что в swap полезло -
Апрель 4, 2012, 2:12 п.п., спустя 3 минуты 43 секунды
Также еще условие что если дата окончания попадала в расчетный период. <- Тут я имел ввиду что дата окончания была не меньше расчетного периодаСпустя 56 сек.Вот другой вариант запроса:SELECT *
FROM customer_service
INNER JOIN tariffs ON tariffs.id = customer_service.tariffs
WHERE (
`datepicker1` <= '2012-05-01'
)
AND (
end_date IS NULL
OR end_date >= '2012-05-31'
) -
Апрель 4, 2012, 2:14 п.п., спустя 2 минуты 17 секунд
denic, в каком виде хранятся даты в базе данных?Спустя 19 сек.база уже есть и работает или ты только проектируешь её?не всё полезно, что в swap полезло -
-
Апрель 4, 2012, 2:21 п.п., спустя 5 минут 32 секунды
скопируй сюда show create table customer_service и show create table tariffsне всё полезно, что в swap полезло -
Апрель 4, 2012, 2:24 п.п., спустя 3 минуты 5 секунд
CREATE TABLE `customer_service` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uniq_id` varchar(255) NOT NULL,
`id_group` int(11) NOT NULL,
`id_account` int(11) NOT NULL,
`payment_name` varchar(255) NOT NULL,
`resources` varchar(255) DEFAULT NULL,
`name` int(11) DEFAULT NULL,
`tariffs` varchar(255) DEFAULT NULL,
`datepicker1` date NOT NULL,
`end_date` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=343 DEFAULT CHARSET=utf8CREATE TABLE `tariffs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tariff_name` varchar(255) NOT NULL,
`price` double(6,2) NOT NULL,
`id_assortment` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=79 DEFAULT CHARSET=utf8 -
Апрель 4, 2012, 3:04 п.п., спустя 40 минут 29 секунд
1. определяешь границы пересечения периода статистики и периода, определённого в datepicker1..end_date
2. считаешь количество дней между вычисленными границами
3. по каждому дню делаешь начисление согласно тарифуне всё полезно, что в swap полезло -
Апрель 4, 2012, 3:32 п.п., спустя 28 минут 4 секунды
вот этот момент не понятен (реализация) - 1. определяешь границы пересечения периода статистики и периода, определённого в datepicker1..end_date -
Апрель 4, 2012, 4:13 п.п., спустя 40 минут 36 секунд
Сделал вот так вроде работает:SELECT customer_service.id, `id_group` , `id_account` , `payment_name` , `datepicker1` , `end_date` , tariffs.price
FROM customer_service
INNER JOIN tariffs ON tariffs.id = customer_service.tariffs
WHERE (
`datepicker1` <= '2012-03-01'
OR `datepicker1`
BETWEEN '2012-03-01'
AND '2012-03-31'
)
AND (
end_date IS NULL
OR end_date > '2012-03-31'
OR end_date
BETWEEN '2012-03-01'
AND '2012-03-31'
) -
Апрель 4, 2012, 5:54 п.п., спустя 1 час 41 минуту 26 секунд
ну ёпт
диапазоны A1..A2 и B1..B2 пересекаются если:
A1 <= B2 && A2 <= B1
при этом область пересечения будет max(A1, B1)..min(A2, B2)
диапазон А поглощён диапазоном B если
B1<=A1 && B2>=A2
диапазоны не пересекаются если
A1>B2 || B1<A2не всё полезно, что в swap полезло
Пожалуйста, авторизуйтесь, чтобы написать комментарий!