ФорумРазработкаБазы данных → Вопрос по запросу

Вопрос по запросу

  • denic

    Сообщения: 18 Репутация: N Группа: Кто попало

    Spritz Апрель 4, 2012, 11:57 д.п.

    Доброго всем дня!

    суть вопроса: Есть дата начала предоставления услуги, она может еще не наступила и есть дата окончания предоставления услуги (ее может и не быть). Необходимо сделать начисление за услуги за предыдущий месяц, даже если процесс начисления начался не 1 числа, предположим 10 числа. Также еще условие что если дата окончания (если вдруг она есть) попадала в расчетный период.
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz Апрель 4, 2012, 12:28 п.п., спустя 31 минуту 24 секунды

    Какие запросы у вас получились?
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz Апрель 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ι унц-унц
  • denic

    Сообщения: 18 Репутация: N Группа: Кто попало

    Spritz Апрель 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( )
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Апрель 4, 2012, 2:08 п.п., спустя 57 минут 15 секунд

    Также еще условие что если дата окончания попадала в расчетный период.

    Что касается незаконченных предложений.
    не всё полезно, что в swap полезло
  • denic

    Сообщения: 18 Репутация: N Группа: Кто попало

    Spritz Апрель 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'
    )
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Апрель 4, 2012, 2:14 п.п., спустя 2 минуты 17 секунд

    denic, в каком виде хранятся даты в базе данных?
    Спустя 19 сек.
    база уже есть и работает или ты только проектируешь её?
    не всё полезно, что в swap полезло
  • denic

    Сообщения: 18 Репутация: N Группа: Кто попало

    Spritz Апрель 4, 2012, 2:15 п.п., спустя 1 минуту 21 секунду

    1. Формат Date
    2. База уже есть
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Апрель 4, 2012, 2:21 п.п., спустя 5 минут 32 секунды

    скопируй сюда show create table customer_service и show create table tariffs
    не всё полезно, что в swap полезло
  • denic

    Сообщения: 18 Репутация: N Группа: Кто попало

    Spritz Апрель 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=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
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Апрель 4, 2012, 3:04 п.п., спустя 40 минут 29 секунд

    1. определяешь границы пересечения периода статистики и периода, определённого в datepicker1..end_date
    2. считаешь количество дней между вычисленными границами
    3. по каждому дню делаешь начисление согласно тарифу
    не всё полезно, что в swap полезло
  • denic

    Сообщения: 18 Репутация: N Группа: Кто попало

    Spritz Апрель 4, 2012, 3:32 п.п., спустя 28 минут 4 секунды

    вот этот момент не понятен (реализация) - 1. определяешь границы пересечения периода статистики и периода, определённого в datepicker1..end_date
  • denic

    Сообщения: 18 Репутация: N Группа: Кто попало

    Spritz Апрель 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'
    )
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Апрель 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 полезло

Пожалуйста, авторизуйтесь, чтобы написать комментарий!