绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
LEFT、RIGHT、CHARINDEX,SUBSTRING示例应用
2023-03-20 15:34:10
/*
原因是网上挂号的病人,年龄问题,比如五年前是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

分享好友

分享这个小栈给你的朋友们,一起进步吧。

SQLServer
创建时间:2023-03-20 14:06:14
美国Microsoft公司推出的一种关系型数据库系统。SQL Server是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统,实现了与WindowsNT的有机结合,提供了基于事务的企业级信息管理系统方案。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 飘絮絮絮丶
    专家
戳我,来吐槽~