我铸造real
到int
和float
到int
和比较两个这样的:铸造REAL为INT和比较
where
cast(a.[SUM(PAID_AMT)] as int)!=cast(b.PAID_AMT as int)
,但我仍然得到结果,其中两个是相等的。例如:
+-----------+-----------+------------+------------+----------+
| accn | load_dt | pmtdt | sumpaidamt | Bpaidamt |
+-----------+-----------+------------+------------+----------+
| A133312 | 6/7/2011 | 11/28/2011 | 98.39 | 98.39 |
| A445070 | 6/2/2011 | 9/22/2011 | 204.93 | 204.93 |
| A465606 | 5/19/2011 | 10/19/2011 | 560.79 | 560.79 |
| A508742 | 7/12/2011 | 10/19/2011 | 279.65 | 279.65 |
| A567730 | 5/27/2011 | 10/24/2011 | 212.76 | 212.76 |
| A617277 | 7/12/2011 | 10/12/2011 | 322.02 | 322.02 |
| A626384 | 6/16/2011 | 10/21/2011 | 415.84 | 415.84 |
| AA0000044 | 5/12/2011 | 5/23/2011 | 197.38 | 197.38 |
+-----------+-----------+------------+------------+----------+
这里是完整的查询:
select
a.accn,
a.load_dt,
a.pmtdt,
a.[SUM(PAID_AMT)] sumpaidamt,
sum(b.paid_amt) Bpaidamt
from
[MILLENNIUM_DW_DEV].[dbo].[Millennium_Payment_Data_May2011_July2012] a
join
F_PAYOR_PAYMENTS_DAILY b
on
a.accn=b.ACCESSION_ID
and
a.final_rpt_dt=b.FINAL_REPORT_DATE
and
a.load_dt=b.LOAD_DATE
and
a.pmtdt=b.PAYMENT_DATE
where
cast(a.[SUM(PAID_AMT)] as int)!=cast(b.PAID_AMT as int)
group by
a.accn,
a.load_dt,
a.pmtdt,
a.[SUM(PAID_AMT)]
我到底做错了什么?我如何只返回不相等的记录?
我想你从来没有听说过的浮点问题?货币值应该从不**以浮点类型表示(一方面,您不能完全表示'.1')。其余的可能只是在某个时候四舍五入,但更喜欢样本数据来检查。 – 2012-08-09 21:58:30
@ X-Zero谢谢。我应该铸造成不同的东西吗? – 2012-08-09 21:59:19
你应该将**数据存储为基于整数的类型(单位为美分,或者你有什么)或者固定精度的十进制类型;我相信'DECIMAL'和'NUMERIC'是标准类型,尽管一些RDBMS具有自定义的MONEY(或类似)类型。你不应该为了比较而投入任何东西,它应该比较恰到好处。请注意,尽管大多数金额可能会在'预计'总额的一分内给出结果,但在某一点之后,“最小”差异会更大(如不能表示1或更小的差异,并且变得更差) – 2012-08-09 22:35:35