字段的一部分是日期...有时

时间:2018-08-08 12:59:00

标签: 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-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

请有人帮忙吗?

1 个答案:

答案 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;