sql中的模式匹配失败,datetime转换错误

时间:2014-09-04 07:27:39

标签: sql sql-server regex tsql sql-server-2012

我收到的短信代码如“yyyy / mm-digit”(每封邮件的数字递增)。所以我想确保用户发送的代码完全采用该格式,否则为另一个动作。怎么样?

这是我要检查的代码,但它总是执行else块,为什么?注意:我想要它,例如“2014/8位”有点模式,怎么样? (它随年月而变化)

这是我的小小努力,但它正在投入dateitme转换失败错误加上它可能还有其他问题,帮助

Alter PROCEDURE TestTrigger



AS
BEGIN
     Begin Try
           Declare @msg as varchar(20)
           SELECT @msg = '2014/9-1'

           DECLARE @yyyymm varchar(255) = Convert(Varchar ,(cast(year(@msg) as varchar(255)) + '/' +
                                right(cast(month(@msg) as varchar(255)), 2)
                               ));

                IF (@msg like @yyyymm + '-[0-9]%' and
                    @msg not like @yyyymm + '-%[^0-9]%'
                   )
                  BEGIN
                    Print 'Done'
                  END
                  ELSE
                  BEGIN
                    Print 'Not Done'
                  END
    END TRY
    BEGIN CATCH
     Select ERROR_MESSAGE() as ErrorMsg
    END CATCH

END
GO

2 个答案:

答案 0 :(得分:0)

试试这个

你在当天的比赛中错过了'0'。请看下面: 之前是:'2014 / 9-2' 更正SELECT @msg ='2014 / 09-2'

完整解决方案如下所述:

 Declare @msg as varchar(20)
           SELECT @msg = '2014/09-2'

           DECLARE @yyyymm varchar(255) = (cast(year(getdate()) as varchar(255)) + '/' +
                                right('00' + cast(month(getdate()) as varchar(255)), 2)
                               );



                IF (@msg like @yyyymm + '-[0-9]%' and
                    @msg not like @yyyymm + '-%[^0-9]%'
                   )
                  BEGIN
                    Print 'Done'
                  END
                  ELSE
                  BEGIN
                    Print 'Not Done'
                  END

感谢。

答案 1 :(得分:0)

这意味着你要设置 选择@msg ='2014 / 8-2'。尝试将其更改为 选择@msg ='2014 / 08-2',你需要在8之前追加'0',因为@yyyymm将作为'2014-08'出现。