Преобразование NVARCHAR в SMALLDATETIME на SQL SERVER 2008

В настоящее время я работаю над обновлением базы данных компании, в которой в одной из таблиц CreateDt имеет тип nvarchar(20) и хранит даты следующими способами:

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

Есть 17000 строк.

Так что в настоящее время я работаю над кодом, в котором я смогу преобразовать все эти даты в один формат, такой как 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.


person UCDA2919    schedule 07.03.2019    source источник
comment
Очень похоже на вчерашний stackoverflow.com/questions/55024773/   -  person jarlh    schedule 07.03.2019
comment
что ты уже испробовал?   -  person Nico Haase    schedule 07.03.2019
comment
я отредактировал вопрос, чтобы показать, что я использовал до сих пор   -  person UCDA2919    schedule 07.03.2019
comment
В ваших примерных данных нет хитрых дат. Добавьте 11/12/2012, чтобы усложнить задачу.   -  person jarlh    schedule 07.03.2019
comment
У вас есть 13/10 и 12/14 в данных. Как вы планируете обращаться с 10/11? 11 октября или 10 ноября?   -  person Salman A    schedule 07.03.2019
comment
приведенный выше код изменен, все форматы ожидаются 29/01/2001 08:51:56, которые, как я понимаю, будут дд/мм/гггг, и способы, которыми можно изменить сценарий, чтобы решить эту проблему?   -  person UCDA2919    schedule 07.03.2019


Ответы (2)


Попробуйте добавить функцию LEFT в RIGHT к вашему запросу в случае, например:

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
person liquid    schedule 07.03.2019
comment
Это упорядочило это! Все даты теперь преобразованы, ваша помощь очень ценится - person UCDA2919; 07.03.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;
person Kattarina    schedule 07.03.2019