powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Преобразование данных
3 сообщений из 3, страница 1 из 1
Преобразование данных
    #40126724
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Если запустить такой код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DROP TABLE IF EXISTS #MyTable1;

CREATE TABLE #MyTable1 (Value real);

INSERT INTO #MyTable1 
	(Value)
VALUES
	(201.7445), (23.60291), (178.1416), (286376.8), (218775.3), 
        (67601.47), (10), (10.0), (10.00), (-1),
        (-1.2), (-1.02), (-201.7445), (0), (Null);;

SELECT
	Value
	,TRIM(STR(Value, 15,3)) AS [STR_15_3]
	,TRIM(STR(Value, 15,8)) AS [STR_15_8]
	,CAST(Value AS NVARCHAR(Max)) AS [NVARCHAR(Max)]
	,CAST(Value AS DECIMAL(15, 3)) AS [DECIMAL_15_3]
	,CAST(Value AS DECIMAL(15, 8)) AS [DECIMAL_15_8]
FROM
	#MyTable1;

то возвращает такой результат
Value STR_15_3 STR_15_8 NVARCHAR(Max) DECIMAL_15_3 DECIMAL_15_8201.7445 201.745 201.74450684 201.745 201.745 201.7445068423.60291 23.603 23.60290909 23.6029 23.603 23.60290909178.1416 178.142 178.14160156 178.142 178.142 178.14160156286376.8 286376.813 286376.81250000 286377 286376.813 286376.81250000218775.3 218775.297 218775.29687500 218775 218775.297 218775.2968750067601.47 67601.469 67601.46875000 67601.5 67601.469 67601.4687500010 10.000 10.00000000 10 10.000 10.0000000010 10.000 10.00000000 10 10.000 10.0000000010 10.000 10.00000000 10 10.000 10.00000000-1 -1.000 -1.00000000 -1 -1.000 -1.00000000-1.2 -1.200 -1.20000005 -1.2 -1.200 -1.20000005-1.02 -1.020 -1.01999998 -1.02 -1.020 -1.01999998-201.7445 -201.745 -201.74450684 -201.745 -201.745 -201.744506840 0.000 0.00000000 0 0.000 0.00000000NULL NULL NULL NULL NULL NULL
1. При преобразовании в NVARCHAR(Max), то во многих строках строках срезает правый крайний символ и округляет предпоследний. Как сделать так, чтобы не срезал и не округлял?

2. Из справки SQL: "По умолчанию SQL Server использует округление с потерей точности и масштаба при преобразовании числа в значение decimal или numeric". Аналогично для STR. Возможно задать, чтобы не округлял?

3. Как и для STR, так и для DECIMAL, если указать 8 символов после запятой, то появляются какие то цифры, которые нет в исходнике. Почему так? И как это предотвратить?
...
Рейтинг: 0 / 0
Преобразование данных
    #40126773
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариантов ажно 2:

1. Изучить и понять устройство REAL/FLOAT. И не задавать глупых вопросов.
2. Считать в целых числах (DECIMAL).
...
Рейтинг: 0 / 0
Преобразование данных
    #40126790
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы при преобразовании данных не терялась точность (не срезались и появлялись лишние цифры), написал пока так. Код пока еще не оптимальный.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
DROP TABLE IF EXISTS #MyTable1;

CREATE TABLE #MyTable1 ( Value real);

INSERT INTO #MyTable1 
	(Value)
VALUES
	(201.7445), (23.60291), (178.1416), (286376.8), (218775.3),
	(67601.47), (10), (10.0), (10.00), (-1),
	(-1.2), (-1.02), (-201.7445), (0), (Null),
	(0.0001), (-0.0001), (0.0000000001), (-0.0000000001);

SELECT
	Value
	--,CONVERT_Value
	--,[CHARINDEX]
	--,CountOfLeftSymbols
	--,CountOfRightSymbols
	,CASE 
		WHEN CountOfLeftSymbols + CountOfRightSymbols <=15 THEN 
			CASE CountOfRightSymbols
				WHEN 0 THEN CAST(Value AS DECIMAL(15, 0))
				WHEN 1 THEN CAST(Value AS DECIMAL(15, 1)) 
				WHEN 2 THEN CAST(Value AS DECIMAL(15, 2)) 
				WHEN 3 THEN CAST(Value AS DECIMAL(15, 3)) 
				WHEN 4 THEN CAST(Value AS DECIMAL(15, 4)) 
				WHEN 5 THEN CAST(Value AS DECIMAL(15, 5))
				ELSE CAST(Value AS DECIMAL(15, 6))
			END
                --ELSE
		--	
	END AS [DECIMAL]
FROM
	(SELECT
		Value
		,CONVERT_Value
		,[CHARINDEX]
		,IIF(
			[CHARINDEX] > 0,
			LEN(LEFT(CONVERT_Value, [CHARINDEX]-1)),
			LEN(CONVERT_Value)
		) AS CountOfLeftSymbols
		,IIF(
			Value != 0 AND [CHARINDEX] > 0,
			LEN(RIGHT(CONVERT_Value, LEN(CONVERT_Value) - [CHARINDEX])),
			0
		) AS CountOfRightSymbols
	FROM
		(SELECT
			Value,
			CONVERT_Value,
			CHARINDEX('.', CONVERT_Value) AS [CHARINDEX]
		FROM
			(SELECT
				Value
				,REPLACE(CONVERT (VARCHAR(MAX), Value, 128), '-', '') AS CONVERT_Value
			FROM
				#MyTable1) t1) t2) t3;

Выдает такой результат
Value DECIMAL201.7445 201.744500023.60291 23.6029100178.1416 178.1416000286376.8 286376.8000000218775.3 218775.300000067601.47 67601.470000010 10.000000010 10.000000010 10.0000000-1 -1.0000000-1.2 -1.2000000-1.02 -1.0200000-201.7445 -201.74450000 0.0000000NULL NULL0.0001 0.0001000-0.0001 -0.00010001E-10 0.0000000-1E-10 0.0000000
Хотел узнать, в данном решении есть то, чего не учитывается?
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Преобразование данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]