Sql server 在SQL Server中将varchar值转换为日期

Sql server 在SQL Server中将varchar值转换为日期,sql-server,sql-server-2012,sql-server-2008-r2,varchar,date-conversion,Sql Server,Sql Server 2012,Sql Server 2008 R2,Varchar,Date Conversion,我正在SQL server中将varchar数据转换为日期 具有如下数据的表 因此,它可以有空值、正确格式的日期,并且可以有类似于19900411和04221995的内容 所以我尝试了下面的方法,但出现了错误 SELECT CASE WHEN ISNULL(CAST(Dob AS VARCHAR), '') = '' THEN NULL WHEN LEN(CAST(Dob AS VARCHAR)) = '8' THEN CONVERT(

我正在SQL server中将varchar数据转换为日期

具有如下数据的表

因此,它可以有空值、正确格式的日期,并且可以有类似于
19900411
04221995
的内容

所以我尝试了下面的方法,但出现了错误

SELECT CASE 
            WHEN ISNULL(CAST(Dob AS VARCHAR), '') = '' THEN NULL
            WHEN LEN(CAST(Dob AS VARCHAR)) = '8' THEN CONVERT(
                     VARCHAR(10),
                     CONVERT(date, RIGHT(Dob, 4) + LEFT(Dob, 2) + SUBSTRING(Dob, 3, 2)),
                     103
                 )
            ELSE CONVERT(VARCHAR, CAST(Dob AS CHAR(8)), 103)
       END
FROM   TableName
WHERE  Dob IS NOT NULL
转换时,Msg 241,16级,状态1,第3行转换失败 来自字符串的日期和/或时间

我想以日期格式获得输出
MM dd yyyy


请帮帮我!谢谢

您可以使用此查询解决您的问题。它只需将varchar列转换为格式化的MM dd yyyy

select convert(varchar(10), cast('2011-09-28' as date), 101)

我想,你需要这个:

SELECT CASE 
        WHEN ISNULL(CAST(Dob AS VARCHAR), '') = '' THEN NULL
        WHEN LEN(CAST(Dob AS VARCHAR)) = '8' THEN CONVERT(VARCHAR(10),
               CONVERT(date, RIGHT(Dob, 2) + '-' +  SUBSTRING(Dob, 5, 2) +'-' + LEFT(Dob, 4)),
               103)
        ELSE CONVERT(VARCHAR, CAST(Dob AS CHAR(10)), 103)
   END
FROM   tbl
WHERE  Dob IS NOT NULL
输出:
04/11/1990


SQL Fiddle演示:

您能检查一下这个答案吗。这是SQLServer2012及更高版本的工作

根据您的讨论,我创建了一个示例数据

CREATE TABLE #A
( COL VARCHAR(10)
) 
INSERT INTO #A VALUES( NULL),('19900411'),('19900411'),('04-04-1976'),('10-30-1952')
insert into #A values ('04221995')
insert into #A values ('02222009 ')
select * from #a
 SELECT 
    case isdate(col ) when  1 then  CONVERT(VARCHAR, CONVERT(DATE, COL) , 105) 
        when 0 then  SUBSTRING(COL,1,2) + '-'+SUBSTRING(COL,3,2) + '-'+SUBSTRING(COL,5,4)  
        end
 FROM #A

分两步完成-首先统一字符串格式,然后转换为日期。如果您可以更改表格以在日期列中保存日期,这将是最好的。实际上,数据将以平面文件格式导入此表格,因此我无法更改它。在一步中不可能?您能识别表中的所有日期格式吗?不能识别所有日期,但我必须处理像
0422195
这样的日期,是
12301123
1123年12月30日还是1230年11月23日?准确识别每种格式非常重要,否则,您会在最佳情况下出现错误,或者在最坏情况下出现错误日期。从字符串转换日期和/或时间时,获取错误
Msg 241,16级,状态1,第1行转换失败。
您可以通过强制转换DobI来优化此操作,但仍然得到同样的错误<代码>强制转换(Dob为字符(8)显示演示时出错-哎呀!出现问题。请重试,如果继续出现这种情况,请发送电子邮件admin@sqlfiddle.com关于它。不正确的语法。我已经更改了它,但没有成功。@pedram我已经更新了我的答案。请使用这个。其他人已经编辑了我的答案。谢谢。但是对于像
0222209
谢谢你的回答!这个数据怎么样?表中也有类似的数据。所以你能提供更好的答案吗?不起作用。请为类似于
04221995的数据提供一些解决方案。我插入了那个日期,也请检查上面的答案
CREATE TABLE #A
( COL VARCHAR(10)
) 
INSERT INTO #A VALUES( NULL),('19900411'),('19900411'),('04-04-1976'),('10-30-1952')
insert into #A values ('04221995')
insert into #A values ('02222009 ')
select * from #a
 SELECT 
    case isdate(col ) when  1 then  CONVERT(VARCHAR, CONVERT(DATE, COL) , 105) 
        when 0 then  SUBSTRING(COL,1,2) + '-'+SUBSTRING(COL,3,2) + '-'+SUBSTRING(COL,5,4)  
        end
 FROM #A