Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция произовольные отчетные периоды 
:(
    Опции темы
Ripperr
Дата 9.9.2017, 03:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 1.11.2008

Репутация: нет
Всего: нет



Нужно получить номер периода по диапазону месяц день

Код

BEGIN

SET input_date = DATE_FORMAT(input_date, '%m-%d');


IF (
    input_date BETWEEN '01-29'
    AND '04-31'
) THEN
    RETURN 1;


ELSEIF (
    input_date BETWEEN '05-01'
    AND '07-31'
) THEN
    RETURN 2;


ELSEIF (
    input_date BETWEEN '08-01'
    AND '10-31'
) THEN
    RETURN 3;


ELSEIF (
    input_date BETWEEN '11-01'
    AND '12-29'
) THEN
    RETURN 4;


ELSE
    RETURN FALSE;


END
IF;


END


К функции обращаются много кратно так как использую ее при выборке.
Она тормозит выполнение запроса ... При таблице в 10к записей запрос через эту функцию выполняется в 10 раз медление чем если просто задать диапазон BETWEN в запросе чем через равно функция =1 ...

Как это оптимизировать или правильно написать.

Входные данные текст выходные int(1) может если смысл подавать date четсно говоря не сильно в этом.
PM MAIL ICQ   Вверх
Akina
Дата 9.9.2017, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



ЗБС... название раздела читай внимательнее. Желательно по буквам...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ripperr
Дата 9.9.2017, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 1.11.2008

Репутация: нет
Всего: нет



Программирование -> Базы данных -> MySQL (еще)

Что не так вопрос по функции MySQL
PM MAIL ICQ   Вверх
Akina
Дата 9.9.2017, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Тогда надо приводить ПОЛНЫЙ текст функции - включая дефиницию и декларации. Сейчас это выглядит как анонимка, которых в MySQL нет.

Самое простое, и при этом вполне нормальное и реляционное, решение - это создать служебную таблицу, в которой хранить соответствие (ДиапазонДат - Период). Её можно включать в источник данных запроса. А функция тогда вообще не нужна. При очень большом желании эту таблицу можно генерировать непосредственно в запросе или оформить как представление.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ripperr
Дата 9.9.2017, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 1.11.2008

Репутация: нет
Всего: нет



Что именно под диапазоном дат ты имееш ввиду.
Как задать диапазон и как потом к нему ссылаться чтобы возвращать искомую цифру квартала.

Код

CREATE DEFINER=`ripper`@`%` FUNCTION `CUSTOM_QUARTER`(input_date text) RETURNS int(1)
    DETERMINISTIC
BEGIN

SET input_date = DATE_FORMAT(input_date, '%m-%d');


IF (
    input_date BETWEEN '03-29'
    AND '05-31'
) THEN
    RETURN 1;


ELSEIF (
    input_date BETWEEN '06-01'
    AND '08-31'
) THEN
    RETURN 2;


ELSEIF (
    input_date BETWEEN '09-01'
    AND '11-30'
) THEN
    RETURN 3;


ELSEIF (
    input_date BETWEEN '12-01'
    AND '12-29'
) THEN
    RETURN 4;


ELSE
    RETURN FALSE;


END
IF;


END

PM MAIL ICQ   Вверх
Akina
Дата 9.9.2017, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Цитата(Ripperr @  10.9.2017,  00:06 Найти цитируемый пост)
Что именно под диапазоном дат ты имееш ввиду.

Да тот диапазон, который проверяется твоими IF-ами. (От-До-Номер).

Код

CREATE TABLE periods (
dFrom text,
dTill text,
num into
);

INSERT INTO periods
SELECT '03-29','05-31',1 UNION ALL
SELECT '06-01','08-31',2 UNION ALL
SELECT '09-01','11-30',3 UNION ALL
SELECT '12-01','12-31',4 ;


Диапазоны взяты из последней версии функции.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ripperr
Дата 10.9.2017, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 1.11.2008

Репутация: нет
Всего: нет



А запрашивать так ?

Код

SELECT
    periods.num
FROM
    periods
WHERE
    "09-05" BETWEEN periods.dFrom
AND periods.dTill


Это будет не ресурсоемко если много будет таких сверок ?
PM MAIL ICQ   Вверх
Zloxa
Дата 10.9.2017, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3470
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(Ripperr @  9.9.2017,  04:11 Найти цитируемый пост)
К функции обращаются много кратно так как использую ее при выборке.

В табилце хранить не только аргументы функции, но и ее результат, по которому осуществлвять отбор.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ripperr
Дата 10.9.2017, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 1.11.2008

Репутация: нет
Всего: нет



Попробовал но есть вопрос у меня было запрос типа

Код

SELECT
    table_a.id
FROM
    `table_a`
INNER JOIN table_c ON table_a.sub = table_c.sub
INNER JOIN table_b ON table_b.filebelong_toid = table_a.id
WHERE
    table_a.sub = COALESCE (table_a.sub, table_a.sub)
AND table_b.filebelong_totype = 2
AND YEAR (
    table_b.fileupload_datetime
) = 2017
AND CUSTOM_QUARTER (table_b_datetime) = 2
GROUP BY
    table_a.id


Чтобы заменить это я добавляю

Код

SELECT
    table_a.id
FROM
    `table_a`
INNER JOIN table_c ON table_a.sub = table_c.sub
INNER JOIN table_b ON table_b.filebelong_toid = table_a.id
INNER JOIN periods ON table_b.fileupload_datetime BETWEEN periods.dFrom AND periods.dTill
WHERE
    table_a.sub = COALESCE (table_a.sub, table_a.sub)
AND table_b.filebelong_totype = 2
AND (
periods.`quarter` =1
AND 
periods.`year` = 2017)
GROUP BY
    table_a.id


Просто вместо одной функции приходится вводить много текста (((

Это сообщение отредактировал(а) Ripperr - 10.9.2017, 16:57
PM MAIL ICQ   Вверх
Akina
Дата 10.9.2017, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 453



Заботиться надо об эффективности создаваемого кода, а не о количестве потраченных на него байтов...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1659 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.