powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / не получаеться написать код - обнуляюца значения
4 сообщений из 4, страница 1 из 1
не получаеться написать код - обнуляюца значения
    #38658620
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
суть задачи.

есть пользователи, у них есть размер потребления услуги(поле)

есть щета (один к одному) пользователей с балансом и последней датойвременем билинга.

и вот запуская очередной билинг, он должен по сути

1)пощатать сумму для списания = такса * на промежуток времени между сейчас и последним списанием
2)обновить на єту величину(отрицательную) поле баланса, и естественно метку времени последнего списания.

ДЕЛАЮ
1)открываю курсор на получения троек значений (idcurrency,.user.size,currency.last)
iduser = idcurrency

курсор нужен так как там матюки идут на попытку делать селект из таблицы щетов и её же обновлять - update currencys select ...from users join currencys ... не получаеться.
по всякому делал на лету временую таблицу - один чорт ругаеться.

2)
беря по одной записи щитаю сколько списать надо

Код: sql
1.
2.
3.
4.
5.
6.
7.
DECLARE tax DECIMAL(21,17) DEFAULT 0;
DECLARE iNow TIMESTAMP DEFAULT CURRENT_TIMESTAMP;

set tax = CAST(5 as DECIMAL(21,17))/DAYOFMONTH(LAST_DAY(NOW()))/3600/24/1099511627776;

#users.size* TIMESTAMPDIFF(SECOND,iNow,currencys.last) * tax
#величина которая идёт на вставку


про вставку обьясню
изменение баланса просиходит путём записи в таблицу логизменений (вставка) а её тригер
произведёт апдейт баланса с учётом возможной скидки и прочей мути. пока что тупо апдейт без скидок и прочего....
(без курсора, через вставку тоже ругаеться, на попытку менять таблицу при чтении из которой запускаються изменения)

в таблицах где храниться баланс, или изменение, везде используеться тип DECIMAL(21,17)

в тригере log_currencys_insert_after арифметика простая
update currency set `last` = NEW.time, balance = balance + NEW.addmoney;

addmoney как описано выше
=users.size* TIMESTAMPDIFF(SECOND,iNow,currencys.last) * tax

где размер услуги - целое большое число
tax = CAST(5 as DECIMAL(21,17))/DAYOFMONTH(LAST_DAY(NOW()))/3600/24/1099511627776;

и что интересно

Код: sql
1.
2.
3.
4.
5.
6.
7.
set @iNow = CURRENT_TIMESTAMP();
SET @tax = CAST(5 as DECIMAL(21,17))/DAYOFMONTH(LAST_DAY(NOW()))/3600/24/1099511627776;


SELECT NULL,
		u.size * TIMESTAMPDIFF(SECOND,@iNow,c.`last`) * @tax as 'addmoney',@iNow,u.iduser
FROM users u join currencys c on (u.iduser = c.idcurrency);


вот этот код выдаёт не нулевые изменения баланса
-0.000000014435614884635548532745 - вот такого типа изменения

как я полагаю имено такое изменение я щитываю в переменную из курсора
(переменая тоже число(21,17))
а потом гдето происходит округление.
не могу понять где?

ЗЫ
грёбанное автоприведение типов.

ЗЫЗЫ
когда я инициализировал билинг (муть ещо та, но по сути я запускал похожий код для прощёта начального баланса ..разница была лишь в получении последней даты и размера

вместа поля размер и последнияя дата было
джоин таблицы услуг, и sum(ислуга.размер * таксу * (сейчас - услуга.начало)

счас когда билинг, сума всех услуг уже готовая, на старте просто просумировал по каждой услуге. и не было зануления значений.
...
Рейтинг: 0 / 0
не получаеться написать код - обнуляюца значения
    #38658665
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453делал на лету временую таблицу - один чорт ругаетьсячто-то не так делали, значит
alex564657498765453грёбанное автоприведение типов.ну приведите типы вручную _везде_, и посмотрите, останется ошибка или нет

ЗЫ. так и не понял, значения чего обнуляются - дельт или итогов
ЗЗЫ. и скажите название системы, чтобы мы были в курсе, куда деньги класть не надо
...
Рейтинг: 0 / 0
не получаеться написать код - обнуляюца значения
    #38658791
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tangliralex564657498765453делал на лету временую таблицу - один чорт ругаетьсячто-то не так делали, значит
alex564657498765453грёбанное автоприведение типов.ну приведите типы вручную _везде_, и посмотрите, останется ошибка или нет

ЗЫ. так и не понял, значения чего обнуляются - дельт или итогов
ЗЗЫ. и скажите название системы, чтобы мы были в курсе, куда деньги класть не надо

сразу видно кто в мыслях меня всегда держит :) приятно...

инсерт уже вставляет зануленые значения.
получаеться, что селект аля который беря поле сайз выщитывает мелкодробное значение - всё работает - он выдаёт кучу нулей после запятой и потом значащие цифры.

хранимка же
где это делаеться в два этапа - курсор на выборку

и для каждого полученого из курсора сайт выщитывает по тем же самым формулам величину которую и вставляет в таблицу - вставляет ноль.
...
Рейтинг: 0 / 0
не получаеться написать код - обнуляюца значения
    #38658796
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tangliralex564657498765453делал на лету временую таблицу - один чорт ругаетьсячто-то не так делали, значит
alex564657498765453грёбанное автоприведение типов.ну приведите типы вручную _везде_, и посмотрите, останется ошибка или нет

ЗЫ. так и не понял, значения чего обнуляются - дельт или итогов
ЗЗЫ. и скажите название системы, чтобы мы были в курсе, куда деньги класть не надо

а деньги можно будет класть смело. вишь, ещо даже до релиза не дошло, а я даже такие недочоты нахожу. (при реальных обьёмах там значения будут больше 1, но для тестов я расматриваю теоретически минимальные значения - дабы убедиться, что нигде точность не седаеться...
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / не получаеться написать код - обнуляюца значения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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