Имя: Пароль:
1C
 
Теряются разряды результата 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