Как я могу рассчитать разницу в дате, умножение в хранимой процедуре MySQL? - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь реализовать процедуру в mysql, которая возвращает количество дней на основе расчета. Передается дата покупки (добавленная дата), а затем выполняется расчет. Должно быть относительно прямым, но я не могу заставить его работать. Я не уверен, что это подходящая ситуация для «оператора select», и я прошу прощения, если это очень просто, но это мой первый запуск процедур.

Если кто-нибудь может сказать мне, что мне делать, это будет очень признательно.

Спасибо!

У меня есть таблица с именем " калькуляция " (ТАБЛИЦА 3), которая содержит поле "elap_yend" (int), которое в настоящее время пусто, пока не будет вызвана хранимая процедура.

Таблица 1:

cid     parent_cat      category_name            category_life 
22        0             Office Equipment-M'         1080            
23        0             Office Equipment-O'         1800            
24        0             F & F'                      3600            
25        0             Staff assets',              1800            
27        0             Motor vehicle',             2880            
28        0             Air conditioner'            5400            
29        0             Land & Building',           2160            
30        0             Temporary Partition         365         
31        0             Electrical Fittings         3600            
32        0             Generator'                  5400            
33        0             Software'                   1800            
34        0             Computer-N'                 2160            
35        24            chair'                      3600    

Tble 2:

pid    cid    product_name      product_price   added_date  cgst  sgst igst  total      depre 
60      22    RHFL\test\001         20000       2018-11-02  1800  1800  0     23600     o
61      27    RHFL\test\002         13500       2018-11-02  2345  2345  0     15930     12
62      29    RHFL\test\003         65000       2018-11-02  2345  2345  0     76700     12
63      31    RHFL\test\004         10000       2018-11-02  2345  2345  0     1180      12
64      24    RHFL\test\005         10000       2018-11-02  2345  2345  0     11800      1
65      24    RHFL\test\006         13500       2018-11-02  2345  2345  0     15930     12
66      34    RHFL\test\007         13500       2018-11-02  2345  2345  0     15930     12
67      22    RHFL\test\008         65004       2018-11-02  2345  2345  0     76704     12
68      25    RHFL\test\009         10000       0000-00-00  2345  2345  0     11800     12
69      22    RHFL\test\010         65000       0000-00-00  2345  2345  0     76700     10
                                                                                        70

Таблица 3: выходные данные хранимой процедуры должны отражаться в таблице ниже:

   end_date   elap_yend rem_days depre_cur cur_wdv depre_next next_wdv acc_depre    
   2018-11-02     0                 0      0         0          0        0

Расчет выхода:

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

   DELIMITER $$

CREATE PROCEDURE calculationTemp(
    in  till_yend date, 
    )
BEGIN
    DECLARE till_yend date;

    SELECT datediff(now(),added_date) INTO till_yend
    FROM products

    IF till_yend > 0 THEN
 SET till_yend = select datediff(now(),added_date) from products;
        ELSEIF till_yend < 0 THEN
        SET till_yend = 0;
    END IF;
 insert into calculationTemp
END$$

Расчетные работы:

Конец года Elapsede: elapsed_yend = добавленная дата (из таблицы продуктов (№: 2)) до каждого года 31 марта / xxxx.

Количество дней между этими двумя датами

оставшиеся дни = категория_жизни - (разница дат между добавленной датой (от продуктов (№: 1)) до даты)

category_life (из таблицы категорий (№: 1)) Пример: мобильный, его жизнь будет 1080 дней.

Амортизация за текущий год: depreciation_cur = (depre / category_life) * elapsed_yend

  • Текущий год Записанное значение:

    current_wdv = depre - depreciation_cur

  • Амортизация в следующем году: depreciation_next = (depre / category_life) * D D = разность дней между каждым годом 01 / апрель / xxxx до конечной даты (из таблицы расчета)

  • В следующем году записанное значение:

    next_wdv = current_wdv - depreciation_next

  • Начисление амортизации:

    накопление_депр = depreciation_cur + depreciation_next

1 Ответ

0 голосов
/ 13 ноября 2018

Получил мой ответ, публикуя здесь, чтобы получить представление об улучшении процедуры моего магазина. Спасибо !!!

 BEGIN
    DECLARE cur_depre,cur_wtvalue,next_depre,next_wtvalue,accum_depre,pro_loss double(20,2);
    DECLARE days,next_diff int;

    CREATE TABLE IF NOT EXISTS calc AS (SELECT p.pid,p_date,days,next_diff,cur_depre,cur_wtvalue,next_depre,next_wtvalue,accum_depre,pro_loss,c.cid,p.added_date,c.category_life,p.depre,p.sale_status,p.sale_date,p.sale_amount from products p,products d,categories c WHERE p.pid=d.pid AND p.cid=c.cid 
     );
     INSERT INTO calc (PID) 
    SELECT PID FROM products WHERE PID NOT IN (SELECT PID FROM calc);
    UPDATE calc set days = datediff(p_date,added_date);
    UPDATE calc set days = 0 WHERE datediff(p_date,added_date) < 0;
    UPDATE calc set next_diff = datediff(sale_date,DATE_ADD(p_date, INTERVAL 1 DAY) );
    UPDATE calc set next_diff = datediff('2019-03-31',added_date) WHERE added_date>p_date;
    UPDATE calc set cur_depre = (depre/category_life)*datediff(p_date,added_date);

    UPDATE calc set cur_depre = 0 where (depre/category_life)*datediff(p_date,added_date)<0;

    UPDATE calc set cur_wtvalue =(depre-(depre/category_life)*datediff(p_date,added_date)); 

    UPDATE calc set cur_wtvalue = 0 WHERE added_date>p_date;

    UPDATE calc set next_depre =( (depre/category_life)*datediff(sale_date,DATE_ADD(p_date, INTERVAL 1 DAY) )) where added_date < p_date;

    UPDATE calc set next_depre =( (depre/category_life) * datediff('2019-03-31',added_date)) WHERE added_Date > p_date;

    UPDATE calc SET next_wtvalue = depre -(depre/category_life)*datediff(p_date,added_date) - (( (depre/category_life)*datediff(sale_date,DATE_ADD(p_date, INTERVAL 1 DAY) )) );
    UPDATE calc SET next_wtvalue = depre - (( (depre/category_life) * datediff('2019-03-31',added_date)))  WHERE added_date>p_date;

    UPDATE calc SET accum_depre = ((depre/category_life)*datediff(p_date,added_date))+( (depre/category_life)*datediff(sale_date,DATE_ADD(p_date, INTERVAL 1 DAY) )) ;
    UPDATE calc SET accum_depre =( (depre/category_life) * datediff('2019-03-31',added_date))  WHERE added_Date > p_date;

    UPDATE calc SET pro_loss = sale_amount-(depre -(depre/category_life)*datediff(p_date,added_date) - (( (depre/category_life)*datediff(sale_date,DATE_ADD(p_date, INTERVAL 1 DAY) )) ) ); 

    UPDATE calc SET pro_loss = 0 WHERE sale_status=0;
    SELECT * from calc;

    END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...