SQL Server에서 MONEY 또는 DECIMAL(x,y) 데이터 유형을 선택해야 합니까?
이 두 가지 사이에 진짜 차이가 있는지 궁금해요.money 것decimal(19,4)(그게 돈이 내부적으로 사용하는 것이라고 생각합니다.)
있다moneySQL Server の 용용니다 。 샘플 데이터베이스 은 SQL Server를 사용합니다(AdventureWorks는 AdventureWorks 데이터베이스 등).money anddecimal★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
머니 데이터형을 계속 사용해야 하나요, 아니면 십진법을 대신 사용하는 것이 장점이 있나요?돈은 입력할 문자 수가 적지만, 이는 유효한 이유가 아닙니다.
절대 돈을 쓰면 안 돼요.정확하지 않고 완전 가비지입니다.항상 10진수/숫자를 사용합니다.
다음을 수행하여 내 뜻을 확인합니다.
DECLARE
@mon1 MONEY,
@mon2 MONEY,
@mon3 MONEY,
@mon4 MONEY,
@num1 DECIMAL(19,4),
@num2 DECIMAL(19,4),
@num3 DECIMAL(19,4),
@num4 DECIMAL(19,4)
SELECT
@mon1 = 100, @mon2 = 339, @mon3 = 10000,
@num1 = 100, @num2 = 339, @num3 = 10000
SET @mon4 = @mon1/@mon2*@mon3
SET @num4 = @num1/@num2*@num3
SELECT @mon4 AS moneyresult,
@num4 AS numericresult
출력: 2949.0000 2949.8525
돈을 돈으로 나누지 않는다고 말하는 사람들에게:
여기 상관관계를 계산하기 위한 질문 중 하나가 있는데, 그것을 돈으로 바꾸면 잘못된 결과가 나옵니다.
select t1.index_id,t2.index_id,(avg(t1.monret*t2.monret)
-(avg(t1.monret) * avg(t2.monret)))
/((sqrt(avg(square(t1.monret)) - square(avg(t1.monret))))
*(sqrt(avg(square(t2.monret)) - square(avg(t2.monret))))),
current_timestamp,@MaxDate
from Table1 t1 join Table1 t2 on t1.Date = traDate
group by t1.index_id,t2.index_id
SQLMenace는 돈이 정확하지 않다고 말했다.하지만 당신은 돈으로 돈을 곱하거나 나누지 않아요!3달러 곱하기 50센트는 얼마입니까?150달러?돈을 10진수여야 하는 스칼라로 곱하거나 나눕니다.
DECLARE
@mon1 MONEY,
@mon4 MONEY,
@num1 DECIMAL(19,4),
@num2 DECIMAL(19,4),
@num3 DECIMAL(19,4),
@num4 DECIMAL(19,4)
SELECT
@mon1 = 100,
@num1 = 100, @num2 = 339, @num3 = 10000
SET @mon4 = @mon1/@num2*@num3
SET @num4 = @num1/@num2*@num3
SELECT @mon4 AS moneyresult,
@num4 AS numericresult
결과는 다음과 같습니다.
금전 결과 수치 결과--------------------- ---------------------------------------2949.8525 2949.8525
money을 나타내지 「4」, 「4」, 「4」, 「4」, 「4」, 「4」, 「4」, 「3」, 「3」, 「3」, 「4」, 「3」의 스칼라인 것을 해 주세요.decimals.
무엇을 하고 있는지 모르면 모든 것이 위험하다.
고정밀 10진수형도 하루를 저장할 수 없습니다.
declare @num1 numeric(38,22)
declare @num2 numeric(38,22)
set @num1 = .0000006
set @num2 = 1.0
select @num1 * @num2 * 1000000
1.000000 <- 0.6000000이어야 합니다.
money 입니다.
의 텍스트 smallmoney ★★★★★★★★★★★★★★★★★」decimal(10,4)비슷해 보일 수도 있지만 그렇다고 서로 교환할 수 있는 건 아니에요다음 날짜로 저장된 날짜를 보면 움츠러드나요?varchar(10)이거랑 똑같아
에는 ★★★★★★★★★★★★★★★★★★★★」money/smallmoney ★★★★★★★★★★★★★★★★★.bigint/int의 money-----dd-yyyyyyyyyyyy. yy-mm-ddd.SQL은 실제로 이러한 정보를 내부에 저장하지 않습니다.
★★★에 decimal »money니즈에 맞는 것을 고르세요.money어카운팅값을 유닛의 1/2분의 1의 정수배수로 저장하는 것은 매우 일반적이기 때문에 타입이 존재합니다.또한 단순한 덧셈과 뺄셈을 넘어 실제 돈과 계산을 다루고 있다면 데이터베이스 수준에서 처리해서는 안 됩니다.Banker's Rounding(IEEE 754)을 지원하는 라이브러리를 사용하여 애플리케이션 수준에서 실행
WayneM이 SQL Server에만 돈이 있다는 것을 알고 있다고 말한 것을 알고 있습니다.하지만, 그는 십진수보다 돈을 사용하는 이유가 있는지, 혹은 그 반대인지 묻고 있습니다.저는 십진수를 사용하는 것은 DBMS를 변경해야 할 경우 걱정할 필요가 없다는 것을 의미합니다.
시스템을 최대한 유연하게!
저는 ,, 난, 아를 .MONEY보다 1바이트나중에 .DECIMAL@수 없는 )는 @SQ에도 될 수 있습니다LMenace의 예(알지 못하는 사람들에게 훌륭한 경고)는 다음과 같이 적용될 수 있습니다.INTegers, 결과가 0이 되는 곳.그렇다고 해서 정수를 사용하지 않을 이유는 없습니다.
'안심하다 '안심하다', '안심하다' 이렇게 쓰는 .MONEY하는 은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.MONEY사용하세요(예: 수학의 법칙에 따라 하세요.INT
가 SQL Server의 요?MONEY 빠져 있다DECIMAL s(또는 s))FLOAT을 선택한s를 승격하는 하지 않았습니다.- 이이 、 s s 、 ? s 、 。또한 프로모션을 선택한 것도 아닙니다.INT에서 에거로FLOAT스스무리무리무리무리무리무리무리무리무리무리무리무리무리.
MONEY 문제가.DECIMAL계산 중에 더 큰 중간 유형을 사용하는 것은 해당 유형을 사용하는 '특징'일 뿐입니다(그리고 그 '특징'이 어디까지 확장되는지 실제로 알 수 없습니다).
구체적인 질문에 답하려면 , 「강요한 이유」를 선택해 주세요.인 SUM(x)서 ''는x 중 하나일 수 .DECIMAL ★★★★★★★★★★★★★★★★★」MONEY , , , 「 」MONEY우위를 점할 겁니다.
사촌SMALLMONEY입니다.4 바이트, 4바이트, 4바이트입니다.214,748.3647비용 대비로는 매우 작기 때문에 그다지 적합하지 않은 경우가 많습니다.
큰 어라운드를 으로 할당하는 경우,DECIMAL에서도 같은 문제가 발생합니다.
declare @a decimal(19,4)
declare @b decimal(19,4)
declare @c decimal(19,4)
declare @d decimal(19,4)
select @a = 100, @b = 339, @c = 10000
set @d = @a/@b
set @d = @d*@c
select @d
2950.0000)DECIMALMONEY
방금 비슷한 문제에 부딪혔는데, 저는 최고 수준의 프레젠테이션 외에는 돈을 사용하지 않는 것에 대해 +1이 되었습니다.여러 테이블(실질적으로 판매 상품권과 판매 청구서)이 있으며, 각 테이블에는 이력상의 이유로 하나 이상의 Money 필드가 포함되어 있으며, 총 청구서 세금 중 어느 정도가 판매 상품권의 각 행에 관련되어 있는지를 계산하기 위해 비례 계산을 수행해야 합니다.우리의 계산은
vat proportion = total invoice vat x (voucher line value / total invoice value)
그 결과 실제 화폐/화폐 계산이 이루어져 분할 부분에서 척도 오차가 발생하며, 이 오차는 잘못된 부가 가치 비율로 곱됩니다.그 후, 이 값을 더하면, 합계 청구 금액이 되지 않는 VAT 비율의 합계가 됩니다.괄호 안의 값 중 하나가 소수(그 중 하나를 캐스팅하려고 합니다)이면 vat 비율이 정확합니다.
원래 브래킷이 없을 때는 값이 크기 때문에 실제로 더 높은 스케일을 시뮬레이션하고 있었던 것 같습니다.처음에 곱셈을 하고 있었기 때문에 괄호를 추가했습니다.이는 드물게 계산에 사용할 수 있는 정밀도를 날려버렸습니다만, 이것으로 인해 이 일반적인 에러가 발생하고 있습니다.
다른 답변의 일반적인 추세에 대한 반대 의견으로요.돈의 많은 이점 보기...SQLCAT 's Guide to Relational Engine'에 있는 데이터 유형!
구체적으로는 다음과 같이 지적하겠습니다.
고객의 도입에 임하면서, 머니 데이터 타입에 관한 몇개의 흥미로운 퍼포먼스 수치를 발견했습니다.예를 들어 Analysis Services를 SQL Server 머니 데이터 유형과 일치하도록 통화 데이터 유형(복수)으로 설정하면 처리 속도(행/초)가 13% 향상되었습니다.SQL Server Integration Services(SSIS) 내에서 1.18TB를 30분 이내에 로드하는 퍼포먼스를 고속화하기 위해 (SSIS 2008 - 세계기록 ETL 퍼포먼스 참조)TPC-H LINE ITEM 테이블의 사이즈가 5바이트인 소수점(9,2)의 4열을 돈(8%)으로 변경함으로써 대량 삽입 속도가 향상되었습니다.성능이 향상된 이유는 SQL Server의 TDS(Tabular Data Stream) 프로토콜 때문입니다. TDS 프로토콜은 SQL Server의 내부 스토리지 형식에 가능한 한 가깝게 데이터를 소형 바이너리 형식으로 전송하는 주요 설계 원칙을 가지고 있습니다.경험적으로, 이는 Kernrate를 사용한 SSIS 2008 - 세계 기록 ETL 성능 테스트에서 관찰되었다. 데이터 유형이 10진수에서 돈으로 전환되었을 때 프로토콜이 크게 떨어졌다.이것에 의해, 데이터의 전송이 가능한 한 효율화됩니다.복잡한 데이터 유형은 고정 폭 유형보다 더 많은 구문 분석과 CPU 사이클을 처리해야 합니다.
그래서 그 질문에 대한 대답은 "그것은 다르다"입니다.정밀도를 유지하려면 특정 산술 연산에 더 주의해야 하지만 성능 고려 사항을 고려할 때 이러한 연산이 유용할 수 있습니다.
MONEY와 MONE을 다르게 보고 싶다.수치, 주로 내 전문지식과 경험을 바탕으로...제 견해는 MONEY입니다.왜냐하면 오랫동안 MONEY를 사용해 왔고, NUMERIAL을 실제로 사용한 적이 없기 때문입니다.
MONEY Pro:
네이티브 데이터 타입CPU 레지스터(32비트 또는 64비트)와 마찬가지로 네이티브 데이터 타입(정수)을 사용하기 때문에 불필요한 오버헤드가 필요 없기 때문에 보다 작고 고속입니다.MONEY는 8바이트, NUMERICAL(19, 4)은 9바이트(12.5%)가 필요합니다.
MONE을 사용하다마나 의 심플한 이이심 심심
SUM100만 데이터에 대한 검정에서는 MONEY가 275ms이고 수치 517ms입니다...거의 두 배나 빠른 속도인데...SUM 테스트의 이유다음 프로 포인트 참조- 비용 대비 최적MONEY는 돈을 보관하고 회계 등의 업무를 수행하는 데 가장 적합합니다.SUM 연산이 완료된 후 단일 보고서에서 수백만 개의 추가(SUM)와 몇 개의 곱셈을 실행할 수 있습니다.매우 큰 회계 애플리케이션의 경우, 거의 2배의 속도로 매우 중요합니다.
- 자금의 정밀도가 낮다.현실에서 돈은 매우 정확할 필요가 없다.많은 분들이 1센트를 신경 쓰시겠지만 0.01센트는 어떠세요?사실 우리나라에서는 은행이 더 이상 센트에 신경 쓰지 않습니다(숫자부터 소수점 이하 쉼표).나는 미국 은행이나 다른 나라에 대해 잘 몰라...
MONEY CON:
- 정밀도는 한정되어 있습니다.MONEY의 정밀도는 4자리(쉼표 뒤)뿐이므로 나눗셈 등의 작업을 수행하기 전에 변환해야 합니다.하지만 다시 한 번
money그렇게 정확할 필요는 없고 단지 숫자가 아니라 돈으로 사용되어야 한다.
하지만... 큰 금액이지만, 여기 당신의 신청서는 실제 돈과 관련이 있지만 회계와 같은 많은 SUM 업무에는 사용하지 마십시오.대신 많은 나눗셈과 곱셈을 사용하는 경우 MONEY를 사용하면 안 됩니다.
이전 게시물은 모두 유효 포인트를 제시하지만, 일부 게시물은 질문에 정확하게 답변하지 않습니다.
문제는 다음과 같습니다.돈이 더 정확하지 않고 복잡한 계산에 사용될 경우 오류가 발생할 수 있다는 것을 이미 알고 있는데 왜 누군가가 돈을 선호할까요?
복잡한 계산을 하지 않고 이 정밀도를 다른 요구와 바꿀 수 있을 때 돈을 사용합니다.
예를 들어 이러한 계산을 수행할 필요가 없고 유효한 통화 텍스트 문자열에서 데이터를 가져와야 하는 경우입니다.이 자동 변환은 MONEY 데이터 유형에서만 작동합니다.
SELECT CONVERT(MONEY, '$1,000.68')
당신만의 수입 루틴을 만들 수 있다는 것을 알고 있습니다.그러나 전 세계 특정 로케일 형식을 사용하여 가져오기 루틴을 재생성하지 않을 수 있습니다.
또 다른 예로는 이러한 계산을 할 필요가 없고(값을 저장하기만 하면 되고) 1바이트를 절약할 필요가 있는 경우(돈은 8바이트, 10진수(19,4)는 9바이트).일부 애플리케이션(고속 CPU, 대용량 RAM, 느린 IO)에서는 대량의 데이터를 읽는 것과 마찬가지로 이 속도도 빨라질 수 있습니다.
가치에 대해 곱셈/나눗셈을 해야 할 때 돈을 사용하면 안 됩니다.화폐는 정수가 저장되는 것과 동일한 방식으로 저장되는 반면, 십진수는 소수점 및 십진수로 저장됩니다.이는 대부분의 경우 화폐가 정확성을 떨어뜨리는 반면 십진법은 원래 규모로 환산될 때만 정확성을 떨어뜨린다는 것을 의미한다.돈은 고정점이기 때문에 계산 중에 그 규모는 변하지 않는다.단, 소수점 문자열로 인쇄될 때는 고정점이므로(Base 2 문자열의 고정 위치가 아니라), 최대 4까지의 값이 정확하게 표시됩니다.그래서 덧셈과 뺄셈은 돈이면 된다.
내부적으로는 10 진수를 나타내므로, 소수점의 위치도 10 진수를 기본으로 한다.그래서 그 부분적인 부분은 돈의 가치를 정확히 나타내죠차이점은 10진수의 중간값이 38자리까지 정밀도를 유지할 수 있다는 것입니다.
부동 소수점 번호를 사용하면 값이 정수인 것처럼 2진수로 저장되며, 소수점(또는 2진수, 에헴)의 위치는 숫자를 나타내는 비트에 상대적입니다.이진 소수점이므로 소수점 직후에 10자리 숫자가 정확도가 떨어집니다.1/5 즉 0.2는 이 방법으로 정확하게 나타낼 수 없습니다.돈이나 소수점 어느 쪽도 이 제한에 시달리지 않는다.
화폐를 십진수로 변환하고 계산을 수행한 다음 결과 값을 화폐 필드 또는 변수에 다시 저장할 수 있습니다.
제 POV에서는 숫자에 대해 너무 신경 쓸 필요 없이 그냥 일어났으면 합니다.만약 모든 계산이 십진수로 변환된다면, 저는 십진수를 사용하고 싶습니다.전시를 위해 돈 필드를 저장하겠습니다.
크기 면에서는 내 마음을 바꿀 만큼 큰 차이를 느끼지 못한다.화폐에는 4~8바이트가 소요되지만 10진수는 5, 9, 13, 17이 될 수 있습니다.9바이트는 8바이트가 가능한 범위 전체를 커버할 수 있습니다.인덱스 단위(비교 및 검색은 비교 가능해야 합니다).
나는 정확도 과목에서 돈보다 십진수를 사용하는 이유를 찾았다.
DECLARE @dOne DECIMAL(19,4),
@dThree DECIMAL(19,4),
@mOne MONEY,
@mThree MONEY,
@fOne FLOAT,
@fThree FLOAT
SELECT @dOne = 1,
@dThree = 3,
@mOne = 1,
@mThree = 3,
@fOne = 1,
@fThree = 3
SELECT (@dOne/@dThree)*@dThree AS DecimalResult,
(@mOne/@mThree)*@mThree AS MoneyResult,
(@fOne/@fThree)*@fThree AS FloatResult
Decimal Result > 1.000000
Money Result > 0.9999
Float Result >1
시험해 보고 결정해 보세요.
나는 방금 블로그 엔트리를 보았다: 돈 vs. SQL Server의 10진수입니다.
그 말은 기본적으로 돈에 정밀도 문제가 있다는 거지
declare @m money
declare @d decimal(9,2)
set @m = 19.34
set @d = 19.34
select (@m/1000)*1000
select (@d/1000)*1000
님의 money19.34달러 19.30달러이다가 있는지 이에서는 몇 제한이 .계산하기 위해 1000개의 파트로 돈을 나누는 어플리케이션 시나리오가 있는지 모르겠지만, 이 예에서는 몇 가지 제한이 있습니다.
언급URL : https://stackoverflow.com/questions/582797/should-you-choose-the-money-or-decimalx-y-datatypes-in-sql-server
'programing' 카테고리의 다른 글
| SQL Server - 클러스터된 인덱스와 비클러스터된 인덱스를 사용할 때 (0) | 2023.04.14 |
|---|---|
| Excel에서 피벗 테이블 데이터 소스를 변경하는 방법 (0) | 2023.04.14 |
| 목표 C: 여러 인수를 사용하여 셀렉터를 호출합니다. (0) | 2023.04.14 |
| Linux bash: 다중 변수 할당 (0) | 2023.04.14 |
| SQL Server: 문자열 데이터 피벗 예시 (0) | 2023.04.14 |