Sql 如何将Dateofbirth列转换为Dateformat(DD/MM/YYYY)

Sql 如何将Dateofbirth列转换为Dateformat(DD/MM/YYYY),sql,sql-server,Sql,Sql Server,我有一张表,上面有这样的列 Actual data wanted data 0k1/01/1976 --01/01/1976 1-1-1991 --01/01/1991 08/04/1968i -- 08/04/1968 18-05-1987j -- 18/05/1987 5d60 -- null I 5 7 1931 -- Null 12/06/1981v -- 12/06/1981 7-12-2012k -- 07/12/2012 6r6r6rr7t7t7t

我有一张表,上面有这样的列

Actual data    wanted data
0k1/01/1976 --01/01/1976
1-1-1991    --01/01/1991
08/04/1968i -- 08/04/1968
18-05-1987j --  18/05/1987
5d60        -- null
I 5 7 1931  -- Null
12/06/1981v -- 12/06/1981
7-12-2012k  -- 07/12/2012
6r6r6rr7t7t7t -- null
我已尝试使用PATINDEX和replace函数,但无法继续创建此函数

alter function [dbo].[RemoveAlphaCharacters](@Temp nvarchar(1000))
returns nvarchar(1000)
as
begin

    declare @KeepValues as nvarchar(50)
    set @KeepValues = '%[^0-9,/,-]%'
    while patindex(@KeepValues, @Temp) > 0
        set @temp = stuff(@Temp, patindex(@KeepValues, @Temp), 1, '')

    return @temp
end
go
试验

结果


参考资料:

这将适用于SQL server 2005+。该函数只调用一次,而不是3次,因此速度要快一点

SELECT
  DOB Original, 
  RemoveNumber,
  CASE WHEN isdate(RemoveNumber) = 1 
  THEN convert(datetime, RemoveNumber) END [DateTime]
FROM yourtable
CROSS APPLY(SELECT dbo.RemoveAlphaCharacters(DOB) RemoveNumber) x

您需要Rawitas Krungkaew回答中的函数

这是您的实际出生日期数据吗?还是那些拼写错误?我希望它们是拼写错误,我甚至不知道如果将sql表设置为日期字段,如何在sql表中获得这样的数据。第一步,清理数据。它看起来像混合数据。您使用的是哪种数据类型?对于如此糟糕的数据,您确定值得尝试修复其中的任何一种吗?您确定任何不明确的日期都是什么意思吗?非年值在1-12范围内,表示可以是日/月或月/日?像您这样的人有这样的含义。非常感谢成为它的一部分@Rawitas Krungkaewcan相同的代码将在2008r2@Rawitas krungkaeworry中工作,我没有安装2008r2。@mohan111 IFF是sqlserver 2012。但很容易转换到2005年
Original        RemoveAlp       DateTime
0k1/01/1976     01/01/1976      1976-01-01 00:00:00.000  
1-1-1991        1-1-1991        1991-01-01 00:00:00.000  
08/04/1968i     08/04/1968      1968-08-04 00:00:00.000  
18-05-1987j     18-05-1987      NULL  
5d60            560             NULL  
I 5 7 1931      571931          NULL  
12/06/1981v     12/06/1981      1981-12-06 00:00:00.000    
7-12-2012k      7-12-2012       2012-07-12 00:00:00.000  
6r6r6rr7t7t7t   666777          NULL  
SELECT
  DOB Original, 
  RemoveNumber,
  CASE WHEN isdate(RemoveNumber) = 1 
  THEN convert(datetime, RemoveNumber) END [DateTime]
FROM yourtable
CROSS APPLY(SELECT dbo.RemoveAlphaCharacters(DOB) RemoveNumber) x