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

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

  • denic

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

    Spritz 4 апреля 2012 г. 0:57

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

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

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

    Spritz 4 апреля 2012 г. 1:28, спустя 31 минуту 24 секунды

    Какие запросы у вас получились?
    adw/0
  • artoodetoo

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

    Spritz 4 апреля 2012 г. 1: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

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

    Spritz 4 апреля 2012 г. 2: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

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

    Spritz 4 апреля 2012 г. 3:08, спустя 57 минут 15 секунд

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

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

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

    Spritz 4 апреля 2012 г. 3:12, спустя 3 минуты 43 секунды

    Также еще условие что если дата окончания попадала в расчетный период. &lt;- Тут я имел ввиду что дата окончания была не меньше расчетного периода {+++56+++} Вот другой вариант запроса:

    SELECT *
    FROM customer_service
    INNER JOIN tariffs ON tariffs.id = customer_service.tariffs
    WHERE (
    `datepicker1` <= &#39;2012-05-01&#39;
    )
    AND (
    end_date IS NULL
    OR end_date >= &#39;2012-05-31&#39;
    )
  • master

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

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

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

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

    Spritz 4 апреля 2012 г. 3:15, спустя 1 минуту 21 секунду

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

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

    Spritz 4 апреля 2012 г. 3:21, спустя 5 минут 32 секунды

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

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

    Spritz 4 апреля 2012 г. 3: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

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

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

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

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

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

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

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

    Spritz 4 апреля 2012 г. 5: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` <= &#39;2012-03-01&#39;
    OR `datepicker1`
    BETWEEN &#39;2012-03-01&#39;
    AND &#39;2012-03-31&#39;
    )
    AND (
    end_date IS NULL
    OR end_date > &#39;2012-03-31&#39;
    OR end_date
    BETWEEN &#39;2012-03-01&#39;
    AND &#39;2012-03-31&#39;
    )
  • master

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

    Spritz 4 апреля 2012 г. 6:54, спустя 1 час 41 минуту 26 секунд

    ну ёпт
    диапазоны A1..A2 и B1..B2 пересекаются если:
    A1 &lt;= B2 &amp;&amp; A2 &lt;= B1
    при этом область пересечения будет max(A1, B1)..min(A2, B2)

    диапазон А поглощён диапазоном B если
    B1&lt;=A1 &amp;&amp; B2>=A2

    диапазоны не пересекаются если
    A1>B2 || B1&lt;A2
    не всё полезно, что в swap полезло

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