Приведение к типу DECIMAL
Преобразование из типа string
Строгий режим
Если исходный тип допускает NULL, возвращается тип, допускающий NULL;
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL;
Определение BNF
<decimal> ::= <whitespace>* <value> <whitespace>*
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
<value> ::= <sign>? <significand> <exponent>?
<sign> ::= "+" | "-"
<significand> ::= <digits> "." <digits> | <digits> | <digits> "." | "." <digits>
<digits> ::= <digit>+
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<exponent> ::= <e_marker> <sign>? <digits>
<e_marker> ::= "e" | "E"
Описание правил
-
Поддерживаются только десятичные цифры;
-
Поддерживается экспоненциальная запись;
-
Поддерживается округление;
-
В начале и конце строк допускаются произвольные пробельные символы, включая: " ", "\t", "\n", "\r", "\f", "\v".
-
При переполнении целой части возвращается ошибка;
-
При недопустимом формате возвращается ошибка.
Примеры
| Строка | Decimal(18, 6) | Комментарий |
|---|---|---|
| "123.1234567" | 123.123457 | Округление |
| "12345." | 12345.000000 | |
| "12345" | 12345.000000 | |
| ".123456" | 0.123456 | |
| " \t\r\n\f\v123.456 \t\r\n\f\v" | 123.456000 | С пробельными символами в начале и конце |
| " \t\r\n\f\v+123.456 \t\r\n\f\v" | 123.456000 | С пробельными символами в начале и конце и знаком плюса |
| " \t\r\n\f\v-123.456 \t\r\n\f\v" | -123.456000 | С пробельными символами в начале и конце и знаком минуса |
| " \t\r\n\f\v+1.234e5 \t\r\n\f\v" | 123400.000000 | Экспоненциальная запись |
| " \t\r\n\f\v+1.234e+5 \t\r\n\f\v" | 123400.000000 | Экспоненциальная запись с положительным показателем степени |
| " \t\r\n\f\v+1.234e-1 \t\r\n\f\v" | 0.123400 | Экспоненциальная запись с отрицательным показателем степени |
| "123.456a" | Error | Недопустимый формат |
| "1234567890123.123456" | Error | Переполнение |
Нестрогий режим
Всегда возвращается тип, допускающий NULL;
Определение BNF
<decimal> ::= <whitespace>* <value> <whitespace>*
<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"
<value> ::= <sign>? <significand> <exponent>
<sign> ::= "+" | "-"
<significand> ::= <digits> | <digits> "." <digits> | <digits> "." | "." <digits>
<digits> ::= <digit>+
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<exponent> ::= <e_marker> <sign>? <digits>
<e_marker> ::= "e" | "E"
Описание правил
-
Поддерживаются все допустимые форматы строгого режима;
-
При переполнении значение преобразуется в NULL;
-
При недопустимом формате значение преобразуется в NULL.
Примеры
| Строка | Decimal(18, 6) | Комментарий |
|---|---|---|
| "123.1234567" | 123.123457 | Округление |
| "12345." | 12345.000000 | |
| "12345" | 12345.000000 | |
| ".123456" | 0.123456 | |
| " \t\r\n\f\v123.456 \t\r\n\f\v" | 123.456000 | С пробельными символами в начале и конце |
| " \t\r\n\f\v+123.456 \t\r\n\f\v" | 123.456000 | С пробельными символами в начале и конце и знаком плюса |
| " \t\r\n\f\v-123.456 \t\r\n\f\v" | -123.456000 | С пробельными символами в начале и конце и знаком минуса |
| " \t\r\n\f\v+1.234e5 \t\r\n\f\v" | 123400.000000 | Экспоненциальная запись |
| " \t\r\n\f\v+1.234e+5 \t\r\n\f\v" | 123400.000000 | Экспоненциальная запись с положительным показателем степени |
| " \t\r\n\f\v+1.234e-1 \t\r\n\f\v" | 0.123400 | Экспоненциальная запись с отрицательным показателем степени |
| "123.456a" | NULL | Недопустимый формат |
| "1234567890123.123456" | NULL | Переполнение |
Преобразование из типа bool
true преобразуется в 1, false преобразуется в 0.
Строгий режим
При переполнении возникает ошибка (например, cast bool as decimal(1, 1)).
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
Нестрогий режим
При переполнении значение преобразуется в NULL.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL:
-
Если возможно переполнение (например,
cast bool as decimal(1, 1)), возвращается тип, допускающий NULL; -
В противном случае возвращается тип, не допускающий NULL.
Преобразование из целочисленного типа
Строгий режим
При переполнении возникает ошибка.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
Примеры
| int | Decimal(18, 9) | Комментарий |
|---|---|---|
| 123 | 123.00000000 | |
| 2147483647 | Error | Переполнение |
Нестрогий режим
При переполнении значение преобразуется в NULL.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL:
-
Если возможно переполнение (например,
cast int as decimal(1, 0)), возвращается тип, допускающий NULL; -
В противном случае возвращается тип, не допускающий NULL (например,
cast int as decimal(18, 0)).
Примеры
| int | Decimal(18, 9) | Комментарий |
|---|---|---|
| 123 | 123.00000000 | |
| 2147483647 | NULL | Переполнение |
Преобразование из типов float/double
Поддерживается округление.
Строгий режим
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
-
Infinity и NaN приводят к ошибкам.
-
При переполнении возникает ошибка.
Примеры
| float/double | Decimal(18, 3) | Комментарий |
|---|---|---|
| 1.1239 | 1.124 | Округление |
| 3.40282e+38 | Error | Переполнение |
| Infinity | Error | |
| NaN | Error |
Нестрогий режим
Всегда возвращается тип, допускающий NULL.
-
+/-Inf преобразуется в NULL;
-
NaN преобразуется в NULL;
-
При переполнении значение преобразуется в NULL.
Примеры
| float/double | Decimal(18, 6) | Комментарий |
|---|---|---|
| 1.123456 | 1.123456 | |
| 3.40282e+38 | NULL | Переполнение |
| Infinity | NULL | |
| NaN | NULL |
Приведение между десятичными типами
Поддерживается округление.
Строгий режим
При переполнении возникает ошибка.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
Примеры
| Decimal(18, 8) | Decimal(10, 6) | Комментарий |
|---|---|---|
| 1234.12345678 | 1234.123457 | Округление |
| 12345.12345678 | Error | Переполнение целой части |
Нестрогий режим
При переполнении значение преобразуется в NULL.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL:
-
Если возможно переполнение (например,
cast decimal(18, 0) as decimal(9, 0)), возвращается тип, допускающий NULL; -
В противном случае возвращается тип, не допускающий NULL (например,
cast decimal(9, 0) as decimal(18, 0)).
Примеры
| Decimal(18, 8) | Decimal(10, 6) | Комментарий |
|---|---|---|
| 1234.12345678 | 1234.123457 | Округление |
| 12345.12345678 | NULL | Переполнение целой части |
Преобразование из типа date
Не поддерживается.
Преобразование из типа datetime
Не поддерживается.
Преобразование из типа time
Не поддерживается.
Преобразование из других типов
Не поддерживается