【问题标题】:Change 2 values in a string更改字符串中的 2 个值
【发布时间】:2015-04-25 01:16:04
【问题描述】:

我将以下字符串2014/15 作为参数传递给我的过程,我需要将45 增加1,所以我最终得到2015/16

显然字符串是VARCHAR,所以我不能使用任何普通的算术函数,也不能使用DATEADD。参数必须按原样传入,我必须推导出一年以上和一年以下以及使用参数。

为了简化,如果您输入 2014/15,那么在我的 SP 中,我将需要在各个部分使用 2013/142014/152015/16,或者 SP 都源自该 1 个字符串。

【问题讨论】:

  • 当“2098/99”弹出时,您是否希望退休?

标签: string tsql increment


【解决方案1】:

你可以这样做:

DECLARE @date VARCHAR(MAX)
SET @date = '2014/15'

SELECT 
    CAST(
        CAST(
            SUBSTRING(@date, 0, CHARINDEX('/', @date)) 
        AS INTEGER) + 1 
    AS VARCHAR(4))
    + '/' 
    + RIGHT(
      CAST(
          CAST(
              SUBSTRING(@date, 0, CHARINDEX('/', @date)) 
          AS INTEGER) + 2
      AS VARCHAR(4))
  , 2)

这里是 SQLFiddle 代码的工作原理。

查询的第一部分将返回年份2014 加1。

然后它会附加一个斜杠。再次使用以相同方式提取的第一个日期(2014 年),将其递增 2。然后将此值转换为 VARCHAR 值,以便对其进行字符串操作(RIGHT() 函数)。

然后我使用 RIGHT() 函数提取最后 2 个字符,并将其附加到原始字符串中。

【讨论】:

    【解决方案2】:

    在这里,这可能会对您有所帮助:

    DECLARE @Input varchar(10)
    SET @Input = '2014/15'
    DECLARE @First INT, @Second INT
    SET @First = SUBSTRING(@Input, 1, CHARINDEX('/', @Input) - 1)
    SET @Second = SUBSTRING(@Input, CHARINDEX('/', @Input) + 1, LEN(@Input))
    SELECT CONVERT(VARCHAR(10), (@First + 1)) + '/' + CONVERT(VARCHAR(10), (@Second + 1))
    

    基本上,它将由正斜杠字符 / 分隔的两个组件拉入 INT 变量,您可以根据需要递增或递减变量,然后将这些结果值转换回 VARCHAR 并将其放回加上分隔符。

    【讨论】:

    • 感谢您的回答,这很好,但我会将答案用作更大变量 SET 的一部分,而我的 SSMS 似乎不喜欢引用 1 个变量的值来设置另一个变量声明部分虽然我不知道为什么
    • 如果我执行以下 DECLARE Var1 AS VARCHAR = 'abc', Var2 AS VARCAHR = Var1+'def' 我得到 Msg 137, Level 15, State 2, Line 3 必须声明标量变量“Var1 "。
    • "Var2 AS VARCAHR = Var1+'def'" 语法无效。你不能那样做。不管怎样,我回答你的问题了吗?如果是,请将其标记为已回答。
    【解决方案3】:

    以下使用记录的隐式类型转换 (Ref.) 将子字符串转换为整数。请注意,它不使用CharIndex 来定位斜线(“/”),而是假定该列具有您指定的格式:四位、斜线、两位。

    declare @Sample as Char(7) = '2014/15';
    select Cast( Left( @Sample, 4 ) + 1 as Char(4) ) + '/' +
      Cast( Right( @Sample, 2 ) + 1 as Char(2) );
    

    【讨论】:

      【解决方案4】:

      我想出了以下,但不是特别优雅

      SUBSTRING(@Date, 1, 3)+CAST(CAST(SUBSTRING(@Date, 4,1)AS INT)+1 AS VARCHAR)+'/'+SUBSTRING(@Date, 6, 1)+CAST(CAST(SUBSTRING(@Date, 7,1)AS INT)+1 AS VARCHAR)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-16
        • 1970-01-01
        • 1970-01-01
        • 2020-08-12
        • 2011-04-18
        • 2019-05-13
        相关资源
        最近更新 更多