|
Теряются разряды результата Pow(2, Х.Число) в запросе 1С на СУБД MSSQL | ☑ | ||
---|---|---|---|---|
0
TormozIT
гуру
25.07.23
✎
08:40
|
Почему запрос
ВЫБРАТЬ 60 КАК Число, 1 ПОМЕСТИТЬ Х; ВЫБРАТЬ Pow(2, Х.Число) - Pow(2, 60) ИЗ Х выдает не ноль на MSSQL? Текст запроса СУБД: 1. CREATE TABLE #tt14 (_Q_000_F_000 NUMERIC(2, 0)) 2. exec sp_executesql N'SELECT (CAST(POWER(CAST(@P1 AS NUMERIC(38, 6)),T1._Q_000_F_000) AS NUMERIC(38, 6)) - @P2) FROM #tt14 T1',N'@P1 numeric(10),@P2 numeric(38,8)',2,1152921504606846976.00000000 По сути имеем POWER(NUMERIC(38, 6),NUMERIC(2, 0)) который отрезает разряды после 17. Статья про округление MSSQL https://habr.com/ru/articles/205938 В файловой базе проблемы нет. |
|||
1
Мультук
гуру
25.07.23
✎
08:51
|
(0)
Запустил в 1С:Предприятие 8.3 (8.3.22.1709) MS_SQL 18 Получил ноль |
|||
2
TormozIT
гуру
25.07.23
✎
08:54
|
У меня MSSQL 12.0.2269.0
|
|||
3
TormozIT
гуру
25.07.23
✎
08:56
|
У меня платформа 1С 8.3.23.1739
|
|||
4
TormozIT
гуру
25.07.23
✎
09:00
|
Совсем чистый тест
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ 60 КАК Число, 1 ПОМЕСТИТЬ Х; |ВЫБРАТЬ Pow(2, Х.Число) - Pow(2, 60) ИЗ Х | |"; Сообщить(XMLСтрока(Запрос.Выполнить().Выгрузить()[0][0])); |
|||
5
TormozIT
гуру
25.07.23
✎
09:26
|
Ну хоть повторить кто нибудь смог?
|
|||
6
timurhv
25.07.23
✎
09:52
|
(5) Тоже 0, запрос другой.
8.3.23.1782 MSSQL 16.0.1000.6 exec sp_executesql N'INSERT INTO #tt3 WITH(TABLOCK) (_Q_000_F_000, _Q_000_F_001) SELECT P1, @P2',N'P1 numeric(10),@P2 numeric(10)',60,1 exec sp_executesql N'SELECT (CAST(POWER(CAST(P1 AS NUMERIC(38, 6)),T1._Q_000_F_000) AS NUMERIC(38, 6)) - CAST(POWER(CAST(@P2 AS NUMERIC(38, 6)),@P3) AS NUMERIC(38, 6))) FROM #tt3 T1 WITH(NOLOCK)',N'P1 numeric(10),@P2 numeric(10),@P3 numeric(10)',2,2,60 |
|||
7
TormozIT
гуру
25.07.23
✎
10:02
|
(6) У тебя нет запроса CREATE TABLE. Поэтому непонятно какой тип у T1._Q_000_F_000 при выполнении POWER()
|
|||
8
Fragster
гуру
25.07.23
✎
10:04
|
||||
9
mikecool
25.07.23
✎
10:07
|
работа с плавающей точкой - всегда проблема
|
|||
10
TormozIT
гуру
25.07.23
✎
10:10
|
На MSSQL 13.0.1601.5 и 1С 8.3.23.1782 возвращается 0.
Значит уже в MSSQL 13 исправили. |
|||
11
TormozIT
гуру
25.07.23
✎
10:13
|
(8) А что там написано по вопросу, чего нет в https://habr.com/ru/articles/205938/ ?
|
|||
12
Fragster
гуру
25.07.23
✎
10:14
|
(11) хз, хабр не открывал даже
|
|||
13
TormozIT
гуру
25.07.23
✎
10:16
|
(12) Кидаться широченными ссылками на документацию легко. А вот объяснить причину конкретной проблемы - намного сложнее.
|
|||
14
Fragster
гуру
25.07.23
✎
10:20
|
создание временной таблицы делает точность 6 (1сная фича, вроде), операция pow возвращает float, который кастуется к точности колонки, тоже 6. почему вторая часть кастуется к 8 не очень понятно, может быть дефолт скуля
|
|||
15
Fragster
гуру
25.07.23
✎
10:21
|
т.е. если ВЫБРАТЬ Выразить(60 КАК Число(38,8)) КАК Число, 1 ПОМЕСТИТЬ Х; толжно прокатить
|
|||
16
Fragster
гуру
25.07.23
✎
10:21
|
*то должно
|
|||
17
TormozIT
гуру
25.07.23
✎
10:24
|
(15) Пробовал делать ВЫРАЗИТЬ() во всех местах. Не помогает.
|
|||
18
TormozIT
гуру
25.07.23
✎
10:25
|
(14) В (0) же четко написал CREATE TABLE #tt14 (_Q_000_F_000 NUMERIC(2, 0)). Откуда ты точность 6 взял?
|
|||
19
Fragster
гуру
25.07.23
✎
11:27
|
(18) когда-то давно когда смотрел в создание временных таблиц 1с замечал, что для чисел там точность 6. может уже что-то изменилось. да и не константно я создавал, а из таблиц занчений
|
|||
20
НафНаф
25.07.23
✎
11:48
|
2^60 это вообще помещается еще в BIGINT
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |