请问这句话出来的数据格式是什么?

yqy0739 2015-12-31 07:05:11
update #hh set savemoney=[Amount]*(1-cast([discount] as decimal(20,2)))/cast([discount] as decimal(20,2))

是 int 吗?还是会有小数?
有人说出来是int,会影响精度,但是不是已经写了 decimal(20,2),为什么还是整数?
...全文
158 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2016-01-04
  • 打赏
  • 举报
回复
cast(NULL AS decimal(20 ,2)) savemoney --指定类型
yqy0739 2016-01-04
  • 打赏
  • 举报
回复
引用 15 楼 roy_88 的回复:
cast(NULL AS decimal(20 ,2)) savemoney --指定类型
谢谢版本这么耐心的指导我,非常感谢~><~~~~
yqy0739 2016-01-04
  • 打赏
  • 举报
回复
引用 13 楼 roy_88 的回复:
[quote=引用 12 楼 yqy0739 的回复:] [quote=引用 11 楼 roy_88 的回复:] 结果精度和小数位数的绝对最大值为 38。当结果精度大于 38 时,相应的小数位数会减少,以避免结果的整数部分被截断。
非常感谢版本,但我今天具体看了一下,Amount的格式是 numeric(18,2),但是出来的savemoney确实是整数,这是为什么呢?[/quote] 你可以把你的值带入公式,整数?是不是把小数后面的0过滤了[/quote] 我突然想到个原因,我在创建前面一张表的时候,是这样的的 select distinct [ID],[Code],[Date],[Amount],SKU, null savemoney into #hh from transaction 是不是因为我这里的 null savemoney, 默认的就是 int 的格式?
中国风 2016-01-04
  • 打赏
  • 举报
回复
引用 12 楼 yqy0739 的回复:
[quote=引用 11 楼 roy_88 的回复:] 结果精度和小数位数的绝对最大值为 38。当结果精度大于 38 时,相应的小数位数会减少,以避免结果的整数部分被截断。
非常感谢版本,但我今天具体看了一下,Amount的格式是 numeric(18,2),但是出来的savemoney确实是整数,这是为什么呢?[/quote] 你可以把你的值带入公式,整数?是不是把小数后面的0过滤了
yqy0739 2016-01-04
  • 打赏
  • 举报
回复
引用 11 楼 roy_88 的回复:
结果精度和小数位数的绝对最大值为 38。当结果精度大于 38 时,相应的小数位数会减少,以避免结果的整数部分被截断。
非常感谢版本,但我今天具体看了一下,Amount的格式是 numeric(18,2),但是出来的savemoney确实是整数,这是为什么呢?
中国风 2016-01-01
  • 打赏
  • 举报
回复
结果精度和小数位数的绝对最大值为 38。当结果精度大于 38 时,相应的小数位数会减少,以避免结果的整数部分被截断。
正牌风哥 2016-01-01
  • 打赏
  • 举报
回复
操作数表达式由表达式 e1(精度为 p1,小数位数为 s1)和表达式 e2(精度为 p2,小数位数为 s2)来表示。非 decimal 类型的任何表达式的精度和小数位数,是对此表达式数据类型定义的精度和小数位数。
运算
结果精度
结果小数位数 *
e1 + e2
max(s1, s2) + max(p1-s1, p2-s2) + 1
max(s1, s2)
e1 - e2
max(s1, s2) + max(p1-s1, p2-s2) + 1
max(s1, s2)
e1 * e2
p1 + p2 + 1
s1 + s2
e1 / e2
p1 - s1 + s2 + max(6, s1 + p2 + 1)
max(6, s1 + p2 + 1)
e1 { UNION | EXCEPT | INTERSECT } e2
max(s1, s2) + max(p1-s1, p2-s2)
max(s1, s2)
e1 % e2
min(p1-s1, p2 -s2) + max( s1,s2 )
max(s1, s2)


参照公式,在联机帮助上
中国风 2015-12-31
  • 打赏
  • 举报
回复
楼主可以自己测测 除得尽会取有效小位数,小于6位时会取6位小数,因第1步是6位 除不尽的情况下,应该是取DECIMAL的默认值(38,18),N年前曾测过记不清了
中国风 2015-12-31
  • 打赏
  • 举报
回复
不可能会是整数,不会影响精度,只会更精确
中国风 2015-12-31
  • 打赏
  • 举报
回复
引用 6 楼 yqy0739 的回复:
[quote=引用 4 楼 roy_88 的回复:]
Amount--是什么类型,有几位小数?
这是类型优先级问题,如果Amount-是整 数或 decimal(20,2)时,值应该是decimal(38,6)


我再问了白痴问题。。。为什么会是 decimal(38,6)?[/quote]
如果Amount是MONEY或INT时,会取有效位数是,小数位实际长度
就是说:
你的表达式先乘,看看小数位是多少?再除看小数位是多少,会取最大的小数位

如果Amount是money*decimal(20,2)=这是6位小数,类型为decimal默认长度为38,所以为(38,6)
这是除得尽的情况下,除不尽会取除以第2步的有效小数值
yqy0739 2015-12-31
  • 打赏
  • 举报
回复
引用 4 楼 roy_88 的回复:
Amount--是什么类型,有几位小数? 这是类型优先级问题,如果Amount-是整 数或 decimal(20,2)时,值应该是decimal(38,6)
我再问了白痴问题。。。为什么会是 decimal(38,6)?
yqy0739 2015-12-31
  • 打赏
  • 举报
回复
引用 4 楼 roy_88 的回复:
Amount--是什么类型,有几位小数? 这是类型优先级问题,如果Amount-是整 数或 decimal(20,2)时,值应该是decimal(38,6)
amount 是两位小数的~
中国风 2015-12-31
  • 打赏
  • 举报
回复
Amount--是什么类型,有几位小数? 这是类型优先级问题,如果Amount-是整 数或 decimal(20,2)时,值应该是decimal(38,6)
中国风 2015-12-31
  • 打赏
  • 举报
回复
引用 楼主 yqy0739 的回复:
update #hh set savemoney=[Amount]*(1-cast([discount] as decimal(20,2)))/cast([discount] as decimal(20,2)) 是 int 吗?还是会有小数? 有人说出来是int,会影响精度,但是不是已经写了 decimal(20,2),为什么还是整数?
看方法是不会影响精度decimal(20,2) 更不可能是INT,只可能是decimal(38,6)
yqy0739 2015-12-31
  • 打赏
  • 举报
回复
引用 1 楼 roy_88 的回复:
cast([Amount]*(1-cast([discount] as decimal(20,2)))/cast([discount] as decimal(20,2)) as decimal(20,2)) 最外层再转换一次
请问,如果不转的话,就是整数吗?我觉得后面写了 decimal(20,2),应该是有小数的呢~
中国风 2015-12-31
  • 打赏
  • 举报
回复
cast([Amount]*(1-cast([discount] as decimal(20,2)))/cast([discount] as decimal(20,2)) as decimal(20,2)) 最外层再转换一次

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧