在 SQL 服务器 2008 上将 NVARCHAR 转换为 SMALLDATETIME

Converting NVARCHAR to SMALLDATETIME on SQL SERVER 2008

我目前正在更新公司数据库,在其中一个表中 CreateDt 属于 nvarchar(20) 类型并按以下方式存储日期:

12 May 12
29/03/2011
9/24/2012
29/01/2001 08:51:56

有 17,000 行。

所以我目前正在编写代码,我将能够将这些日期全部转换为一种格式,例如 DD-MM-YYYY

但是我正在努力寻找合适的东西。

到目前为止我已经尝试过:

WITH CreateDt1
AS
(
    SELECT '14 DECEMBER 12' AS CreateDt1
    UNION ALL
    SELECT '13/10/2005'
    UNION ALL
    SELECT '12/14/2012'
    UNION ALL
    SELECT '24/05/2002 09:28:58' 
    UNION ALL
    SELECT '28/02/2011'
)
SELECT
    CreateDt1,

    CASE WHEN ISDATE(CreateDt1) = 1

    THEN CAST(CreateDt1 AS datetime)

    ELSE 

        CASE WHEN SUBSTRING(CreateDt1, 3, 1) = '/'
        THEN 
            CASE WHEN ISDATE(SUBSTRING(CreateDt1, 4, 2) + '/' + LEFT(CreateDt1, 2) + '/' + RIGHT (CreateDt1, 4)) = 1
                THEN CAST(SUBSTRING(CreateDt1, 4, 2) + '/' + LEFT(CreateDt1 , 2) + '/' + RIGHT (CreateDt1, 4) AS datetime)
            END
        END
    END AS NewDate
FROM fct_Project;

但是 returns 日期的空值,例如 29/01/2001 08:51:56

我刚刚通过添加几行编辑了您的代码,希望对您有所帮助。 请记住,它不能解决 10/11 和 11/10 案例的问题。

WITH CreateDt1
AS
(
    SELECT '14 DECEMBER 12' AS CreateDt1
    UNION ALL
      SELECT '13/10/2005'
     UNION ALL
     SELECT '12/14/2012'
      UNION ALL
    SELECT '24/05/2002 09:28:58'  
     UNION ALL
     SELECT '28/02/2011'
)
SELECT 
    CASE WHEN ISDATE(CreateDt1) = 1
         THEN CAST(CreateDt1 AS datetime)
         ELSE 
             CASE WHEN SUBSTRING(CreateDt1, 3, 1) = '/'
                 THEN 
                    CASE WHEN ISDATE(SUBSTRING(CreateDt1, 4, 2) + '/' + LEFT(CreateDt1, 2) + '/' + RIGHT (CreateDt1, 4)) = 1
                         THEN CAST(SUBSTRING(CreateDt1, 4, 2) + '/' + LEFT(CreateDt1 , 2) + '/' + RIGHT (CreateDt1, 4) AS datetime)
                         WHEN ISDATE(SUBSTRING(CreateDt1, 4, 2) + '/' + LEFT(CreateDt1, 2) + '/' + LEFT((RIGHT (CreateDt1, 13)),4) ) = 1 
                         THEN CAST ( (SUBSTRING(CreateDt1, 4, 2) + '/' + LEFT(CreateDt1, 2) + '/' + LEFT((RIGHT (CreateDt1, 13)),4) ) AS DATETIME)
                    END
             END


    END AS NewDate
FROM CreateDt1;

尝试将 RIGHT 中的 LEFT 函数添加到查询中的 case 子句中,例如:

CASE WHEN ISDATE(CreateDt1) = 1

THEN CAST(CreateDt1 AS datetime)

ELSE 

    CASE WHEN SUBSTRING(CreateDt1, 3, 1) = '/'
    THEN 
        CASE WHEN ISDATE(SUBSTRING(CreateDt1, 4, 2) + '/' + LEFT(CreateDt1, 2) + '/' + RIGHT (LEFT(CreateDt1,10), 4)) = 1
            THEN CAST(SUBSTRING(CreateDt1, 4, 2) + '/' + LEFT(CreateDt1 , 2) + '/' + RIGHT (LEFT(CreateDt1,10), 4) AS datetime)
        END
    END
END AS NewDate