我收到短信代码,如" yyyy / mm-digit" (每个消息的数字递增)。所以我想确保用户发送的代码完全采用该格式,否则为另一个动作。怎么样?
这是我要检查的代码,但它总是执行else块,为什么?注意:我想要它,例如"八分之二千○十四位数"有点模式,怎么样? (它随年月而变化)
这是我的一点点努力,但它投掷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
答案 0 :(得分:0)
原因是YEAR
和MONTH
函数都期望datetime参数,而'2014/9-1'
不是有效的日期时间。
由于您只有两种可能的格式yyyy/mm-digit
适用于10-12个月而yyyy/m-digit
适用于第1-9个月(假设这一年将是过去1000年),您可以使用此比较:
@msg LIKE '[1-2][0-9][0-9][0-9]/[1-9]-%'
OR @msg LIKE '[1-2][0-9][0-9][0-9]/[1][0-2]-%'
如果您需要检查该数字是否为有效数字,您可以使用SUBSTRING和CHARINDEX提取数字,然后检查是否出现任何非数字字符:
NOT SUBSTRING(@msg, CHARINDEX('-', @msg) + 1, LEN(@msg)) LIKE '%[^0-9]%'
e.g。
SELECT msg,
ValidDate = CASE WHEN msg LIKE '[1-2][0-9][0-9][0-9]/[1-9]-%'
OR msg LIKE '[1-2][0-9][0-9][0-9]/[1][0-2]-%'
THEN 1
ELSE 0
END,
ValidDigit = CASE WHEN SUBSTRING(msg, CHARINDEX('-', msg) + 1, LEN(msg)) LIKE '%[^0-9]%'
THEN 0
ELSE 1
END
FROM (VALUES ('2014/9-1'), ('201/9-2'), ('2014/13-3'), ('2014/9-A'), ('2014/0-15x')) t (msg);
所以我认为你的代码会是这样的:
DECLARE @msg VARCHAR(20) = '2014/9-1';
IF ((@msg LIKE '[1-2][0-9][0-9][0-9]/[1-9]-%'
OR @msg LIKE '[1-2][0-9][0-9][0-9]/[1][0-2]-%')
AND NOT SUBSTRING(@msg, CHARINDEX('-', @msg) + 1, LEN(@msg)) LIKE '%[^0-9]%')
BEGIN
PRINT 'Done';
END
ELSE
BEGIN
PRINT 'Not Done';
END