【问题标题】:Varchar type to numeric. Convert Years to months in SQL (SSMS)Varchar 类型为数字。在 SQL (SSMS) 中将年转换为月
【发布时间】:2021-11-17 23:13:08
【问题描述】:

我正在尝试将 TOJ 和 TAR 列都转换为没有 MOS 和 YRS 字符的数字。 例如,18 YRS 0 MOS 需要为(18 * 12 + 0 = 216 个月)。

表名是ld2

TOJ TAR
8YRS 0MOS 14YRS 0MOS
12YRS 0MOS 6YRS 0MOS
5YRS 0MOS 0YRS 4MOS
0YRS 6MOS 26YRS 0MOS
1YRS 0MOS 1YRS 0MOS

More sample data (image)

我试过这个:

select substring(TOJ,PATINDEX('%[0,9]%',TOJ), LEN(TOJ)) 

to get onlt the numbers in TOJ But didn't work.

【问题讨论】:

  • 编辑您的问题并将示例数据显示为文本表格。使用您正在使用的数据库进行标记。
  • 本网站不是代码编写服务。我们可以帮助您解决有关您的代码的具体问题,最好附上MCVE。另外,请do not post images of code。而是将代码发布为纯文本,格式化为“代码”。如果有错误,请将其包含在您的问题中。
  • 请删除图片....(如果您查看image,您就会知道为什么要删除它......)
  • 函数PATINDEX,返回一个你不期望的值。你检查了SELECT PATINDEX('%[0,9]%',TOJ), substring(TOJ,PATINDEX('%[0,9]%',TOJ), LEN(TOJ)) 的输出吗?也许检查REPLACE 功能。它似乎更适合此目的。
  • [0,9] 不是表示数字匹配的正确方法。此外,您可能希望拆分空格字符而不是搜索数字。

标签: sql sql-server numeric varchar


【解决方案1】:
cast(trim(replace(left(s, 2), 'Y', '')) as int) * 12 +
cast(trim(replace(left(right(s, 5), 2), 'M', '')) as int)

假设格式一致,年(月)只能有两位数。

【讨论】:

  • 我们如何将 VARCHAR 类型(结果)转换为小数?
  • 已经是整数了。
【解决方案2】:
select TOJ, CONVERT(DECIMAL(8,2), REPLACE(REPLACE(REPLACE(TOJ,'YRS','.'),'MOS',''),' ',''));
  • 第一次替换,将 'YRS' 替换为 '.'
  • 第二次替换,将'MOS'替换为''
  • 第三次替换,删除空格(将“”替换为“”)

如果您从“27YRS 7MOS”开始,则替换应以“27.7”结束。

如果将“27.7”转换为小数,应该会得到所需的值。

编辑: 编辑原因:月份不是以 10 为基数.....

评论:原来的问题是'..转换为十进制',我真的看错了吗?

select c, (c-c%1)*12 + CASE WHEN PARSENAME(c,1)%10=0 THEN PARSENAME(c,1)/10 ELSE PARSENAME(c,1) END
from (
select 
   TOJ t, 
   CONVERT(DECIMAL(8,2), REPLACE(REPLACE(REPLACE(TOJ,'YRS','.'),'MOS',''),' ','')) c) s;

带有测试数据(即现在提供):DBFIDDLE

【讨论】:

  • 但月份不是以 10 为底的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2014-10-08
  • 1970-01-01
相关资源
最近更新 更多