Преобразование значения varchar в дату в SQL Server

Я конвертирую данные varchar на сегодняшний день на сервере SQL.

Таблица с данными, как показано ниже,

введите здесь описание изображения

Таким образом, он может иметь значение NULL, правильно отформатированную дату и может иметь как 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

Сообщение 241, уровень 16, состояние 1, строка 3 Ошибка преобразования при преобразовании даты и/или времени из строки символов.

Я хотел получить вывод в формате даты MM-dd-yyyy

Пожалуйста, помогите мне! Спасибо!


person pedram    schedule 19.05.2016    source источник
comment
Сделайте это в два шага: начните с унификации форматов строк, а затем преобразуйте их в даты. Если вы можете изменить таблицу, чтобы она содержала дату в столбце даты, это было бы лучше.   -  person Zohar Peled    schedule 19.05.2016
comment
на самом деле данные будут импортированы в эту таблицу в виде плоского файла, поэтому я не могу его изменить. не возможно в 1 шаг?   -  person pedram    schedule 19.05.2016
comment
Можете ли вы определить все форматы даты в вашей таблице?   -  person Zohar Peled    schedule 19.05.2016
comment
не в состоянии идентифицировать все даты, но я должен обрабатывать такие даты, как 04221995   -  person pedram    schedule 19.05.2016
comment
Итак, 12301123 30 декабря 1123 года или 23 ноября 1230 года? крайне важно иметь возможность точно идентифицировать каждый формат, иначе вы получите ошибки в лучшем случае или неправильные даты в худшем случае.   -  person Zohar Peled    schedule 19.05.2016
comment
ты проверил мой ответ   -  person Ajay2707    schedule 19.05.2016
comment
@ Ajay2707 - Да, я проверил ваш ответ, и он мне помог. :)   -  person pedram    schedule 19.05.2016


Ответы (4)


Можете ли вы проверить этот ответ. Это работа для Sqlserver 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
person Ajay2707    schedule 19.05.2016

Вы можете использовать этот запрос для своей проблемы. Он просто преобразует ваш столбец varchar в форматированный MM-dd-yyyy

select convert(varchar(10), cast('2011-09-28' as date), 101)
person Sandeep Kumar    schedule 19.05.2016
comment
Неправильный синтаксис. Я изменил его, но безуспешно. - person pedram; 19.05.2016
comment
@pedram Я обновил свой ответ. Пожалуйста, используйте это. кто-то еще отредактировал мой ответ. - person Sandeep Kumar; 19.05.2016
comment
Благодарю. но все еще получаю ошибку для таких данных, как 02222009 - person pedram; 19.05.2016

Я думаю, вам нужно это:

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

person Vishal Suthar    schedule 19.05.2016
comment
Получение ошибки Msg 241, Level 16, State 1, Line 1 Conversion failed when converting date and/or time from character string. - person pedram; 19.05.2016
comment
вы можете оптимизировать это, используя Доб - person jelliaes; 19.05.2016
comment
Я пробовал, но все равно получаю ту же ошибку. cast(Dob AS CHAR(8) - person pedram; 19.05.2016
comment
Ошибка при показе демо - Упс! Что-то пошло не так. Попробуйте еще раз, и если это повторится, сообщите об этом по электронной почте [email protected]. - person pedram; 19.05.2016

person    schedule
comment
Спасибо за ответ! как насчет этих данных 04221995 - в таблице также есть такие данные. так что можете пожалуйста дать лучший ответ. - person pedram; 19.05.2016
comment
не работает. пожалуйста, какое-нибудь решение для таких данных, как 04221995 - person pedram; 19.05.2016
comment
я вставил эту дату также, пожалуйста, проверьте ответ выше - person Chanukya; 19.05.2016