【问题标题】:Splitting field and adding decimal point to create numeric value SQL拆分字段并添加小数点以创建数值 SQL
【发布时间】:2019-02-22 13:06:20
【问题描述】:

我正在使用的 SQL Server 2014 中有一个字段,如下所示:

**RawField**
20060202
20060323

我想添加一个拆分字段并添加一个小数点并创建一个数字字段。这是我希望看到的:

**RawField**
200602.02
200603.23

所以我需要拆分字段,添加小数点,然后转换为数值。我尝试了一些代码,但出现错误。请参阅下面的代码:

  select top 1000 cast(SUBSTRING(cast(RawField as varchar(6)),1,6) + cast('.' as varchar(1)) + SUBSTRING(cast(RawField as varchar(2)),6,2) as int)
  from Table

我收到以下错误:

Msg 245, Level 16, State 1, Line 11
Conversion failed when converting the varchar value '200602.' to data type int.

这是一个好方法吗?

【问题讨论】:

  • 列的原始类型是什么,没有所有的演员表? (另外,这可能是一个伪装得很差的DATE,而不是任何数字?)
  • 你为什么要将200602.02 转换为 INT?
  • @JeroenMostert 最初它是一个 varchar(50)。这是一个文本文件的文件转储
  • 什么版本的SQL Server(2012+有PARSE,这里可以和STUFF一起使用),你在找什么样的“数值字段”? DECIMAL(8, 2) 将是显而易见的选择,但这与转换为 INT 相矛盾。如果您只想在值中添加一个句点,但将其保留为字符串,那将是 STUFF 的简单应用,但就数据库而言,结果不会真正是“数字”。
  • @JeroenMostert 谢谢!我认为你完美地击中了它。我更喜欢 DECIMAL(8,2)。我遇到了问题,所以我只是尝试使用 INT 来尝试代码。我刚刚写了 CAST(STUFF(RawField, 7, 0, '.') AS DECIMAL(8,2)) 并得到了我的答案!

标签: sql sql-server data-analysis data-manipulation


【解决方案1】:

您想将字符串转换为带 2 位小数的数字吗?

select convert(decimal(10,2), RawField) / 100.0

我邀请您的 RawField 之后包含其他字母数字,而您只发布了前 8 个字符?

这应该可以。只需取前 8 个字符并转换。简单直接

select convert(decimal(10,2), left(RawField, 8)) / 100.0

【讨论】:

  • 松鼠,感谢您的回复,但我收到“将数据类型 varchar 转换为数字时出错”的错误。我想我从@nitzien 那里得到了答案。当我运行那段代码时,它可以完美运行
【解决方案2】:

投射时使用浮点数/数字/小数

select cast(SUBSTRING(RawField ,1,6) + cast('.' as varchar(1)) + SUBSTRING(RawField ,7,2) as numeric(16,2))

【讨论】:

  • 为什么要浮动?这并不是他们真正想要做的。您应该改用数字,因为 float 是一种近似数据类型。
  • 但是不建议float,这里的数据类型不对。
【解决方案3】:

请试试这个。

select top 1000 cast(SUBSTRING(cast(RawField as varchar(6)),1,6) + cast('.' as varchar(1)) + SUBSTRING(cast(RawField as varchar(2)),6,2) as numeric(8,2))
  from Table

您正在尝试将带有十进制数的字符串转换为 int。

【讨论】:

  • 这正是我要找的。谢谢!!
  • 永远不要使用SUBSTRING STUFF 可以实现的东西,我说。 :-P STUFF(RawField, 7, 0, '.').
  • @JeroenMostert 非常感谢!这行得通,而且速度更快!!
猜你喜欢
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多