0

我有以下代码

@FiscalMonth  As varchar(MAX) ='[Dim Date].[Fiscal].[Fiscal Month Number].&[10]&[2014]&[4]&[1]'

就我而言,月份将是10. 我试过下面的代码

SET @FiscalMonthNumber = cast(substring(right(@FiscalMonth,18),1,2) as nvarchar(max))

上面的代码工作正常,但是当我有

@FiscalMonth  As varchar(MAX) ='[Dim Date].[Fiscal].[Fiscal Month Number].&[10]&[2014]&[11]&[1]'

我的结果 0]是不正确的。

4

3 回答 3

2

啊。这假设您第一次遇到这样的模式'[n'(其中n是任何数字,它将出现在字符串的前 8000 个字符内),即月份:

DECLARE @fm VARCHAR(MAX);
SET @fm = '[Dim Date].[Fiscal].[Fiscal Month Number].&[10]&[2014]&[4]&[1]';

SELECT SUBSTRING(@fm, PATINDEX('%[[][0-9]%', @fm) + 1, 
  CHARINDEX(']', SUBSTRING(@fm, PATINDEX('%[[][0-9]%', @fm) + 1, 8000)) - 1);

结果:

----------
10

如果还有其他可能的模式或边缘情况,请告知它们。

SQLfiddle 演示

于 2013-10-02T20:07:40.237 回答
0

我检查了你的代码,它工作正常,在这两种情况下都显示 10,也许你需要研究你的逻辑。

DECLARE @FiscalMonth varchar(MAX) ='[Dim Date].[Fiscal].[Fiscal Month Number].&[10]&[2014]&[4]&[1]'

声明 @FiscalMonthNumber nvarchar(max) = cast(substring(right(@FiscalMonth,18),1,2) 作为 nvarchar(max))

选择@FiscalMonthNumber

DECLARE @FiscalMonth1 As varchar(MAX) ='[Dim Date].[Fiscal].[Fiscal Month Number].&[10]&[2014]&[4]&[1]'

DECLARE @FiscalMonthNumber1 AS nvarchar(max) = cast(substring(right(@FiscalMonth,18),1,2) as nvarchar(max))

选择 @FiscalMonthNumber1

于 2013-10-02T20:10:05.797 回答
0

或者,您可以从字符串中提取所有数字,然后从数字字符串中提取月份。像这样的东西

DECLARE @FiscalMonth1 As varchar(MAX) ='[Dim Date].[Fiscal].[Fiscal Month Number].&[10]&[2014]&[4]&[1]'

WHILE PATINDEX('%[^0-9]%',@FiscalMonth1) <> 0

SET @FiscalMonth1 = STUFF(@FiscalMonth1,PATINDEX('%[^0-9]%',@FiscalMonth1),1,'')

向左选择(@FiscalMonth1, 2)

于 2013-10-02T20:33:10.533 回答