сохранение чисел после десятичной точки в переменной в MySQL - PullRequest
1 голос
/ 28 мая 2020

скажем, я хочу сохранить число после точки (76) в переменной сейчас. Как мне это сделать? Ниже я приведу сценарий.

declare x (3,2);
set x = 323.76;
declare y int;
select cast(substring_index(x, '.', -1) as unsigned) into y;

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 28 мая 2020

Вы можете легко получить десятичные дроби из числа с помощью функции MOD:

SET @num = 323.76;
SET @decimals = MOD(@num, 1) * 100;
SELECT @decimals; -- 76.00

Разделив на 1, вы можете получить остаток с помощью функции MOD, который равен 0.76, а затем вам нужно только умножить это на 100.

0 голосов
/ 28 мая 2020

Если я понимаю спецификацию, это кажется довольно странным. Я бы использовал функцию substring_index, чтобы обрезать все до точки, включая точку. Но я бы сделал математику, чтобы получить значение v, 0 <= v <1 </p>

Следуя псевдокоду MySQL сохраненной программы, указанному в вопросе, примерно так:

DECLARE x DECIMAL(5,2);
DECLARE y BIGINT;

SET x := 323.76;
SET y := SUBSTRING_INDEX( ABS(x)-FLOOR(ABS(x)) ,'.',-1) + 0;

Может быть более простой способ сделать это, но это подход, который удовлетворяет моему пониманию спецификации.

В качестве демонстрации выражения, которое выводит значение y, рассмотрим:

SELECT _x
     , SUBSTRING_INDEX( ABS(_x)-FLOOR(ABS(_x)) ,'.',-1) + 0 AS _y
  FROM ( SELECT 0 AS _x
         UNION ALL SELECT 0.1
         UNION ALL SELECT 2.0 
         UNION ALL SELECT 3.3
         UNION ALL SELECT -4.00
         UNION ALL SELECT -5.55
         UNION ALL SELECT 623.76
         UNION ALL SELECT -723.76
       ) t

возвращает

_x       _y  
-------  -----
   0.00      0
   0.10     10
   2.00      0
   3.30     30
  -4.00      0
  -5.55     55
 623.76     76
-723.76     76
0 голосов
/ 28 мая 2020

В качестве процедуры или функции и триггера вы можете использовать свой код (с небольшими изменениями)

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `mantisse`()
BEGIN
declare x DECIMAL(8,2);

declare y int;
set x = 323.76;
select cast(substring_index(x, '.', -1) as unsigned) into y;
INSERT INTO mytable VALUE (y);
END$$
DELIMITER ;

Или, если вы хотите использовать его в запросе, вы можете использовать определенные пользователем переменные

set @x = 323.96;
select cast(substring_index(@x, '.', -1) as unsigned) into @y;
INSERT INTO mytable VALUE (@y);

у вас уже есть строка, поэтому используйте SUBSTRING, чтобы получить 9

set @x = 323.96;
select cast(SUBSTRING(substring_index(@x, '.', -1),1,1) as unsigned) into @y;
SELECT @y;
INSERT INTO mytable VALUE (@y);

Это, конечно, работает и в Proecdure

...