sql - 在存储过程中将列转换为小数

标签 sql sql-server

我有以下几行代码

Select 0 as Stipend 

然后为了实际增加津贴的值(value),我这样做了

COALESCE(SUM(sdhi.stipend), 0, CONVERT(decimal(16, 4), 0)) Stipend

但它返回为 0,而不是列的小数,我如何将其转换为小数?

最佳答案

0.000 与 0 相同。DECIMAL 数据类型不定义值的格式,仅定义值的存储方式。这意味着,所述值的表示取决于客户端软件,例如 SSMS 或 Web 应用程序。

格式化值应该由客户端软件完成(SSMS 使用当前的默认设置为您完成此操作,其他软件可能不会)

这一行过于复杂:

COALESCE(SUM(sdhi.stipend), 0, CONVERT(decimal(16, 4), 0)) Stipend

此外,文字值 0 的数据类型为 decimal(1,0),因此当 时,结果将为 decimal(1,0) SUM(sdhi.stipend) 为 NULL(只有在求和的组中只有 NULL 值或表为空时才会发生这种情况)。

如果您想强制使用 DECIMAL(16,4) 作为数据类型,这就足够了。

COALESCE(SUM(sdhi.stipend), CONVERT(decimal(16, 4), 0)) Stipend

请注意,SUM(sdhi.stipend) 的结果可能具有不同的精度和小数位数(取决于您存储在列中的数据)。因此,您可能需要考虑以下事项:

CONVERT(decimal(16, 4), COALESCE(SUM(sdhi.stipend), 0)) AS Stipend

这样做的问题是,当 SUM(sdhi.stipend) 的结果超过 decimal(16, 4) 的限制时,您将收到溢出错误。

明智地选择并阅读一些有关 SQL Server 中的十进制算术的内容。

https://learn.microsoft.com/en-us/sql/t-sql/data-types/precision-scale-and-length-transact-sql?view=sql-server-ver15

关于sql - 在存储过程中将列转换为小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62672553/

相关文章:

php - 游标状态无效,SQLExecDirect 中的 SQL 状态 24000

sql-server - 表达式变量在运行时发生变化

sql - 添加具有初始(但不是默认)值的新列的最佳方法?

SQL 选择列中的不同值/列中的动态值计数

SQL 服务器 : Get record with date closest to given date

php - 根据星期几获取价格

sql查询添加列值

mysql - 从 MySQL 中的每小时集中选择 30 个 EOD 记录

sql - 如何检测 SQL 中两个日期时间之间的重叠?

sql - 内连接在最后一个连接中有多个 ON 子句