powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как создать EVENT?
9 сообщений из 9, страница 1 из 1
Как создать EVENT?
    #39894396
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, открыл для себя events :) Простенький ивент, который удаляет старые записи по расписанию, написал без особых проблем. Но споткнулся на более сложном. Суть: в таблицу со структурой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE `notifications_stat` (
  `period` date NOT NULL,
  `id_mkd` int(11) NOT NULL,
  `notif_in_mkd` int(11) NOT NULL,
  `debt_in_mkd` double NOT NULL,
  KEY `fk_ns_mkd` (`id_mkd`),
  KEY `i_per` (`period`),
  CONSTRAINT `fk_ns_mkd` FOREIGN KEY (`id_mkd`) REFERENCES `mkd` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


1-го числа каждого месяца в 00:30 надо записать данные выборки за предыдущий месяц (в примере 1 декабря выбираем данные за ноябрь):
Код: sql
1.
2.
3.
4.
5.
SELECT c.id_mkd,COUNT(n.id_contragent) notif_in_mkd,SUM(debt_total) debt_in_mkd
FROM notifications n 
INNER JOIN contragents c ON n.id_contragent=c.id 
WHERE date_from BETWEEN '2019-11-01' AND '2019-11-30'
GROUP BY c.id_mkd


таким образом:
- в поле period записать дату: 1-е число месяца выборки ('2019-11-01' для примера выше);
- в поле id_mkd записать c.id_mkd ;
- в поле notif_in_mkd записать notif_in_mkd ;
- в поле debt_in_mkd записать debt_in_mkd .

Помогите, пожалуйста, это оформить в виде ивента, если возможно.
...
Рейтинг: 0 / 0
Как создать EVENT?
    #39894401
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing,

В чём проблема?
Код: sql
1.
2.
3.
create event backup_month do 
insert into mytable (a,b,c)  
select --твой select


как-то так.
...
Рейтинг: 0 / 0
Как создать EVENT?
    #39894418
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster,

С датами не могу совладать, а так-то понятно что инсерт фром селект...
...
Рейтинг: 0 / 0
Как создать EVENT?
    #39894435
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing
С датами не могу совладать
Что, такая большая проблема получить диапазон дат предыдущего месяца? тем более что число будет гарантированно первым?

Код: sql
1.
2.
WHERE `date` BETWEEN CURRENT_DATE - INTERVAL 1 MONTH
                 AND CURRENT_DATE - INTERVAL 1 DAY
...
Рейтинг: 0 / 0
Как создать EVENT?
    #39894441
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing,

Короче говоря тебе нужны 2 функции, которая по дате выдают начало и конец предыдущего месяца.
Код: sql
1.
2.
DATE_SUB(now(), INTERVAL 1 MONTH); --должен выдать начало прошлого месяца
DATE_SUB(now(), interval 1 day); --должен выдать конец прошлого месяца


Нет под рукой mysql чтобы проверить. !!!! Надо вырезать время, если оно где-то фигурирует. Мы так один раз хорошо .. опростоволосились, когда выяснилось, что записи за последний день месяца типа 31-01-2019 15:12 не выбираются, потому что не попадают в интервал 01-01-2019 00:00 - 31-01-2019 00:00
...
Рейтинг: 0 / 0
Как создать EVENT?
    #39894448
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, crutchmaster - спасибо, попробую сделать так.
...
Рейтинг: 0 / 0
Как создать EVENT?
    #39894513
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работает! Но есть еще вопрос. Почему нет разницы между "ON COMPLETION PRESERVE" и "ON COMPLETION NOT PRESERVE"? Ведь в последнем случае ивент должен самоудаляться из БД, как я понимаю, но он остается.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE DEFINER=`...` EVENT `event_notification_stat`
	ON SCHEDULE
		EVERY 1 MONTH STARTS '2019-12-01 00:30:00'
	ON COMPLETION PRESERVE
	ENABLE
	COMMENT 'ежемесячный сбор статистики по выписанным уведомлениям'
	DO BEGIN
	INSERT INTO direct_contracts.notifications_stat (period,id_mkd,notif_in_mkd,debt_in_mkd)
	SELECT CURRENT_DATE - INTERVAL 1 MONTH,c.id_mkd,COUNT(n.id_contragent),SUM(debt_total)
	FROM direct_contracts.notifications n 
	INNER JOIN direct_contracts.contragents c ON n.id_contragent=c.id 
	WHERE date_from BETWEEN CURRENT_DATE - INTERVAL 1 MONTH AND CURRENT_DATE - INTERVAL 1 DAY
	GROUP BY c.id_mkd;
END
...
Рейтинг: 0 / 0
Как создать EVENT?
    #39894728
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYing
Почему нет разницы между "ON COMPLETION PRESERVE" и "ON COMPLETION NOT PRESERVE"? Ведь в последнем случае ивент должен самоудаляться из БД, как я понимаю, но он остается.
Данная опция удаляет эвент, если он больше не нужен. Однако он зашедулен навсегда - так что в будущем ещё понадобится... потому и не удаляется. Чтобы удалился, необходим атрибут ENDS.
...
Рейтинг: 0 / 0
Как создать EVENT?
    #39894823
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

грубо, но доходчиво.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как создать EVENT?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]