/*
原因是网上挂号的病人,年龄问题,比如五年前是1岁,现在从网上挂号后,年龄还是一岁;
存储过程中有一个计算年龄的函数,但是调取的格式为1Y8M,也就是1岁零八月,
或者9M(9个月)这样;
想办法把年龄分开,如果带Y,只取年龄不取月份,否则支取月份,在加上年龄单位
然后在分别赋值给年龄和年龄单位。
*/
DECLARE
@I INT,
@K VARCHAR(10),--格式化后的年龄
@AGE INT,--年龄
@P VARCHAR(10)--年龄单位Y,M
SET @K='25Y10M'
SELECT @I=CHARINDEX('Y', @K)
IF @I=
BEGIN
SET @AGE=LEFT(@K,LEN(@K)-1)
SELECT @AGE
SET @P=RIGHT(@K,1) --SET @P='M'这样更方便(2019-07-10 更新,
--今天发现,不能直接写死,如果遇到这种格式的20Y08M29D 就尴尬了,不能显示带天数格式的日期了。)
SELECT @P
END
ELSE
BEGIN
SET @AGE=LEFT(@K,CHARINDEX('Y',@K)-1)
SELECT @AGE
SET @P=SUBSTRING(@K,CHARINDEX('Y',@K),1) --SET @P='Y'这样更方便
SELECT @P
END
正好巩固下之前学到,但是老忘记的 right()、left(),substring()、charindex()等截取函数的应用。
具体语法有空再补充。上班写知乎很尴尬...
------------2019-07-23 生产库发现了个bug,查询后发现是年龄的问题,对于8M28D这种,报错。改后如下
DECLARE
@I INT,
@K VARCHAR(10),--格式化后的年龄
@AGE INT,--年龄
@P VARCHAR(10),--年龄单位Y,M
@I1 INT
SET @K='1D'
SELECT @I=CHARINDEX('Y', @K)
IF @I=
BEGIN
SELECT @I1=CHARINDEX('M', @K)
IF @I1>
BEGIN
SET @AGE=LEFT(@K,CHARINDEX('M',@K)-1)
SELECT @AGE
SET @P=SUBSTRING(@K,CHARINDEX('M',@K),1) --SET @P='M'这样更方便(2019-07-10 更新,
--今天发现,不能直接写死,如果遇到这种格式的20Y08M29D 就尴尬了,不能显示带天数格式的日期了。)
SELECT @P
END
else
BEGIN
SET @AGE=LEFT(@K,LEN(@K)-1)
SELECT @AGE
SET @P=RIGHT(@K,1) --SET @P='M'这样更方便(2019-07-10 更新,
--今天发现,不能直接写死,如果遇到这种格式的20Y08M29D 就尴尬了,不能显示带天数格式的日期了。)
SELECT @P
END
END
ELSE
BEGIN
SET @AGE=LEFT(@K,CHARINDEX('Y',@K)-1)
SELECT @AGE
SET @P=SUBSTRING(@K,CHARINDEX('Y',@K),1) --SET @P='Y'这样更方便
SELECT @P
END