将 varchar 值转换为 SQL 服务器中的日期

Convert varchar value to date in SQL Server

我正在将 varchar 数据转换为 SQL 服务器中的日期。

Table 有如下数据,

所以它可以有 NULL 值、正确格式化的日期并且可以有 1990041104221995

所以我尝试了类似下面的操作,但出现错误。

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, Level 16, State 1, Line 3 Conversion failed when converting date and/or time from character string.

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

请帮帮我!谢谢!

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

select convert(varchar(10), cast('2011-09-28' as date), 101)
    CREATE TABLE #A
    ( COL VARCHAR(10)
    ) 
    INSERT INTO #A VALUES( NULL),('19900411'),('19900411'),('04-04-1976'),('10-30-1952'),('19950422')

     SELECT DATESTRINGFIELD = CONVERT(VARCHAR, CONVERT(DATE, COL) , 101) FROM #A

output
04/11/1990
04/11/1990
04/04/1976
10/30/1952
04/22/1995

我想,你需要这个:

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 演示:SQL DEMO

你能检查这个答案吗?这适用于 Sql Server 2012 及更高版本。

根据我们的讨论,我创建了一个样本数据。

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