Sql 字段的一部分是日期…有时

Sql 字段的一部分是日期…有时,sql,sql-server,date,case,Sql,Sql Server,Date,Case,在一个数据表中有一个字段,它是姓名,在大约70%的时间里,也包括人的生日。 这个生日我需要提取到一个新字段,但是下面插入的脚本抛出了一个 从“字符串”错误消息转换日期和/或时间时,转换失败 (我明白原因)。 我尝试使用“case-when”类型的代码,但最终没有成功 select [NAM_FULL_NAME_INR] ,datepart(month, CONVERT(date, SUBSTRING([NAM_FULL_NAME_INR], patindex('%[0-9][0-

在一个数据表中有一个字段,它是姓名,在大约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

有人可以帮忙吗?

如果生日总是采用相同的格式,您可以使用SQL Server中类似的
的模式功能来检查结尾是否有生日。使用
[0-9]
匹配任何单个字符形式
0
9
。可以随时匹配任何字符

因此,要检查生日的
LIKE
表达式是:

%[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]
如果附加了生日,则将其打包到
CASE…ENDs中,以提取并可能转换子字符串

由于生日模式具有固定长度,因此可以通过使用
substring()
len()
和一些算术运算来实现

convert()
然后使用德语日期样式将字符串转换为日期(
104
四位年份)


请将表的
CREATE TABLE
语句和示例数据作为
INSERT-INTO
语句共享。您使用的是哪种dbms?(该查询使用特定于产品的函数。)示例数据、期望的结果和数据库标记将非常有用。示例数据最好作为+。请将您的问题包括在内,包括您当前的尝试和期望的结果。有关更多详细信息,请询问调试帮助(“此代码为什么不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。
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;