在数据表中有一个字段,名称,大约70%的时间,也是所包括人员的生日。 这个生日,我需要提取到一个新字段,但是下面插入的脚本抛出
从字符串转换日期和/或时间时转换失败”错误消息
(我知道为什么)。 我曾尝试使用“ case when”类型的代码,但最终没有成功。
select [NAM_FULL_NAME_INR]
,datepart(month, CONVERT(date, SUBSTRING([NAM_FULL_NAME_INR], patindex('%[0-9][0-9]/[0-9][0-9]/[0-9][0-9]%', [NAM_FULL_NAME_INR]), 50))) AS MONTHARCHIVED
,datepart(YEAR, CONVERT(date, SUBSTRING([NAM_FULL_NAME_INR], patindex('%[0-9][0-9]/[0-9][0-9]/[0-9][0-9]%', [NAM_FULL_NAME_INR]), 50))) AS YEAR_ARCHIVED
FROM tablename
请有人帮忙吗?
答案 0 :(得分:1)
如果生日总是使用相同的格式,则可以使用SQL Server中LIKE
的模式功能来检查生日是否结束。使用[0-9]
将任何单个字符形式0
匹配到9
。 “%”可随时匹配任何字符。
因此,用于检查生日的LIKE
表达式是:
%[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]
在CASE ... END
s中打包,如果附加了生日,则提取并可能转换子字符串。
由于生日图案的长度是固定的,因此可以使用substring()
,len()
和一些算术运算来实现。
convert()
然后使用德语日期样式(date
为四位数年份)将字符串转换为104
。
SELECT CASE
WHEN nam_full_name_inr LIKE '%[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]' THEN
substring(nam_full_name_inr, 1, len(nam_full_name_inr) - 11)
ELSE
nam_full_name_inr
END name,
CASE
WHEN nam_full_name_inr LIKE '%[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]' THEN
convert(date, substring(nam_full_name_inr, len(nam_full_name_inr) - 9, 10), 104)
END birthday
FROM elbat;