更改字符串中的 2 个值
Change 2 values in a string
我将以下字符串 2014/15
作为参数传递给我的过程,我需要将 4
和 5
递增 1
所以我最终得到2015/16
.
显然字符串是 VARCHAR
所以我不能使用任何正常的算术函数,也不能使用 DATEADD
。参数必须按原样传入,我必须推导一年以上和以下一年以及使用参数。
为简化起见,如果您输入 2014/15
,那么在我的 SP 中,我将需要在各个部分或 SP 全部使用 2013/14
、2014/15
和 2015/16
从那 1 个字符串派生。
在这里,这可能对你有帮助:
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
并将其与分隔符放回一起。
你可以做的是:
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 代码的工作原理。
查询的第一部分将return年份2014
递增1。
然后它会附加一个斜杠。再次使用以相同方式提取的第一个日期 (2014),我将其递增 2。然后我将此值转换为 VARCHAR 值,以便我可以对其执行字符串操作(RIGHT() 函数)。
然后我使用 RIGHT() 函数提取最后 2 个字符,并将其附加到我的原始字符串中。
我想到了以下但不是特别优雅
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)
以下使用记录的隐式类型转换 (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) );
我将以下字符串 2014/15
作为参数传递给我的过程,我需要将 4
和 5
递增 1
所以我最终得到2015/16
.
显然字符串是 VARCHAR
所以我不能使用任何正常的算术函数,也不能使用 DATEADD
。参数必须按原样传入,我必须推导一年以上和以下一年以及使用参数。
为简化起见,如果您输入 2014/15
,那么在我的 SP 中,我将需要在各个部分或 SP 全部使用 2013/14
、2014/15
和 2015/16
从那 1 个字符串派生。
在这里,这可能对你有帮助:
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
并将其与分隔符放回一起。
你可以做的是:
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 代码的工作原理。
查询的第一部分将return年份2014
递增1。
然后它会附加一个斜杠。再次使用以相同方式提取的第一个日期 (2014),我将其递增 2。然后我将此值转换为 VARCHAR 值,以便我可以对其执行字符串操作(RIGHT() 函数)。
然后我使用 RIGHT() 函数提取最后 2 个字符,并将其附加到我的原始字符串中。
我想到了以下但不是特别优雅
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)
以下使用记录的隐式类型转换 (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) );