Форум → Разработка → Базы данных → Вопрос по запросу
Вопрос по запросу
-
Доброго всем дня!
суть вопроса: Есть дата начала предоставления услуги, она может еще не наступила и есть дата окончания предоставления услуги (ее может и не быть). Необходимо сделать начисление за услуги за предыдущий месяц, даже если процесс начисления начался не 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 г. 13: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 г. 14:08, спустя 57 минут 15 секунд
Также еще условие что если дата окончания попадала в расчетный период.
Что касается незаконченных предложений.не всё полезно, что в swap полезло -
4 апреля 2012 г. 14: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 г. 14:14, спустя 2 минуты 17 секунд
denic, в каком виде хранятся даты в базе данных?Спустя 19 сек.база уже есть и работает или ты только проектируешь её?не всё полезно, что в swap полезло -
-
4 апреля 2012 г. 14:21, спустя 5 минут 32 секунды
скопируй сюда show create table customer_service и show create table tariffsне всё полезно, что в swap полезло -
4 апреля 2012 г. 14: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=utf8
CREATE 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 г. 15:04, спустя 40 минут 29 секунд
1. определяешь границы пересечения периода статистики и периода, определённого в datepicker1..end_date
2. считаешь количество дней между вычисленными границами
3. по каждому дню делаешь начисление согласно тарифуне всё полезно, что в swap полезло -
4 апреля 2012 г. 15:32, спустя 28 минут 4 секунды
вот этот момент не понятен (реализация) - 1. определяешь границы пересечения периода статистики и периода, определённого в datepicker1..end_date -
4 апреля 2012 г. 16: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 г. 17: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 полезло
Пожалуйста, авторизуйтесь, чтобы написать комментарий!