Преобразование NVARCHAR в SMALLDATETIME в SQL SERVER 2008 - PullRequest
0 голосов
/ 07 марта 2019

В настоящее время я работаю над обновлением базы данных компании, в которой на одной из таблиц 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;

Однако это возвращает нулевые значения для таких дат, как 29/01/2001 08:51:56.

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Попробуйте добавить ЛЕВУЮ функцию ВПРАВО к вашему запросу в кейсе, например:

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
0 голосов
/ 07 марта 2019

Я только что отредактировал ваш код, добавив несколько строк, надеюсь, это поможет.Имейте в виду, что это не решает проблему 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;
...