MySQL ROUND со столбцом для десятичных дробей не работает должным образом, когда внутри CONCAT - PullRequest
0 голосов
/ 10 сентября 2018

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

Я упростил и воспроизвел проблему в этой SQL Fiddle

Пример кода создания базы данных и ввода данных (из sqlfiddle):

CREATE TABLE `test` ( `Amount` DECIMAL(10,5) NOT NULL , `Decimals` SMALLINT(6) NOT NULL ) ENGINE = InnoDB;

INSERT INTO test (Amount, Decimals) VALUES
(100.12345, 1),
(100.12345, 2),
(100.12345, 3);

Запрос на воспроизведение проблемы:

SELECT CONCAT(ROUND(`Amount`, Decimals), ' ')  FROM test

Все строки выводятся с 5 десятичными разрядами.

Этот запрос дает правильные результаты:

SELECT ROUND(`Amount`, Decimals) FROM test

Я думаю, что нашел ошибку? Если да, то есть ли какой-нибудь другой способ, который я могу использовать тем временем, который будет работать правильно? В моем примере из реального мира мне нужно объединить показания счетчика, округленные до указанных десятичных знаков, с текстом для единицы измерения (например, часы, мили). Мой фактический SQL для этой части выглядит так:

CONCAT(ROUND(`MeterInstances`.`Reading`, `Meters`.`DecimalPlaces`), ' ', `Meters`.`Units`)

1 Ответ

0 голосов
/ 10 сентября 2018

Не думаю, что это действительно ошибка. CONCAT просто возвращает длину десятичной части переменной Amount, которая равна 5. (переменная равна 10,5).

Что вы можете сделать, это использовать функцию SUBSTRING, чтобы обрезать ненужные десятичные части, например:

SELECT CONCAT(SUBSTRING(ROUND(`Amount`, Decimals), 1, LENGTH(`Amount`)-5+`Decimals`), ' ') FROM test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...