将字节转换为千字节/兆字节

时间:2017-02-09 00:04:54

标签: sql sql-server tsql

我有一个附件表,用于以字节为单位存储文档的大小。

我需要以KB或MB显示所有文档的结果集。如果文档小于1MB,则以KB为单位;如果文档大于1MB,则以MB为单位。

目前我在查询中已经有了这个,但是我正在努力使显示在舍入方面正确格式化。

    CASE WHEN D.DocumentSize < 1000000 THEN
        CONCAT(D.DocumentSize / 1024, 'KB')
    ELSE
        CONCAT(D.DocumentSize / 1048576, 'MB')
    END AS DocumentSizeText,

以下是一些示例值:

87336
1458250
346
8434
8434

346字节也将显示0KB,因此理想情况下显示1KB将是理想的最小值。

3 个答案:

答案 0 :(得分:1)

如果要以MB为单位指定有效的十进制值,请使用FORMATN3这里显示3个十进制数字。

(CASE WHEN D.DocumentSize < 1000000 THEN
           CONCAT(CEILING(D.DocumentSize / 1024.0), 'KB')
      ELSE 
           CONCAT(FORMAT(D.DocumentSize / 1048576.0, 'N3'), 'MB')
 END) AS DocumentSizeText

答案 1 :(得分:0)

您希望如何舍入值?如果您想要整理,请使用ceiling()

(CASE WHEN D.DocumentSize < 1000000 THEN
           CONCAT(CEILING(D.DocumentSize / 1024.0), 'KB')
      ELSE CONCAT(CEILING(D.DocumentSize / 1048576.0), 'MB')
 END) AS DocumentSizeText,

答案 2 :(得分:0)

在原始问题中,它建议将值说成四舍五入

346字节也将显示0KB,因此理想情况下显示1KB 至少是理想选择

但是,对答案的澄清注释建议应显示十进制值,而不是四舍五入:

它显示2MB,但对于1458250则应为1.45MB

进一步,这个问题说

如果文档小于1MB,我需要显示一个结果集...以KB为单位;如果文档大于1MB,则需要以MB显示一个结果集

然而,问题中提出的建议答案是将数据拆分为1000000字节,这实际上仅是1兆字节的近似值,所有先前的答案都遵循这一原则。有趣的是,在格式化数据时,使用的兆字节的精确值是:1048576。

我将在下面提供三个答案-

  • 该问题所隐含的一个四舍五入
  • 一个提供十进制值的语言,如注释中所示
  • 可以正确舍入(向上或向下)的一个

我也将扩展答案以显示千兆字节(即使问题不是必需的-如果不需要,也可以删除该子句,但我认为读者可能会发现此扩展定义很有用)。在这两种情况下,我都将使用兆字节和千兆字节的准确定义。完全归功于实际上解决了最初问题的早期答案。

四舍五入到最接近的值

如果要处理文件大小,这是保守的做法,并且计数的字节数多于实际报告的数据。

case 
    when D.DocumentSize < 1048576 then concat(ceiling(D.DocumentSize / 1024.0), ' KB')
    when D.DocumentSize < 1073741824 then concat(ceiling(D.DocumentSize / 1048576.0), ' MB')
    else concat(ceiling(D.DocumentSize / 1073741824.0), ' GB')
end as [DocumentSizeText Rounded Up]

显示3个十进制值

也许更准确,而且可读性更差。

case 
    when D.DocumentSize < 1048576 then concat(format(D.DocumentSize / 1024.0, 'N3'), ' KB')
    when D.DocumentSize < 1073741824 then concat(format(D.DocumentSize / 1048576.0, 'N3'), ' MB')
    else concat(format(D.DocumentSize / 1073741824.0, 'N3'), ' GB')
end as [DocumentSizeText With Decimals]

正确舍入(向上或向下)

求和多个值时,比四舍五入更精确。

case
    when D.DocumentSize < 1048576 then concat(format(D.DocumentSize / 1024.0, 'N0'), ' KB')
    when D.DocumentSize < 1073741824 then concat(format(D.DocumentSize / 1048576.0, 'N0'), ' MB')
    else concat(format(D.DocumentSize / 1073741824.0, 'N0'), ' GB')
end as [DocumentSizeText Rounded Proper]