2017-01-18 2 views
-2

У меня 14-DEC-16 06.23.37.000 дате в csv-файле.Как конвертировать 14-DEC-16 06.23.37.000 в datetime в ssis

Как конвертировать 14-DEC-16 06.23.37.000 в datetime в ssis и вставлять в таблицу sql.

+1

Можете ли вы показать нам, что вы пробовали? – Glorfindel

+2

Используйте либо производную колонку, либо трансформацию скрипта. Этот формат настолько необычен, что нет возможности найти готовое преобразование, особенно когда вы говорите о датах в ** 1916 **. Я предлагаю вам исправить источник или процесс экспорта, чтобы использовать четырехзначные годы. Еще лучше изменить его для экспорта в формате ISO8601. –

+1

Использование двухзначных лет означает, что вы не знаете, что вы импортируете. Мы уже справились с этой проблемой, вызванной Y2K. Reintroducint такая известная ошибка непростительна. Также нет оснований предполагать, что '14-DEC-16' составляет 2016 вместо 1916 года. Это второй год Первой мировой войны. Есть памятные события ** СЕЙЧАС ** о событиях в то время. Вы найдете много подобных дат в течение следующих 2-3 лет. –

ответ

0

Предполагается, что вы работаете над данными, в которых вы ЗНАЕТЕ, что не будет дат вне границ 2000 - 2099, и вы ЗНАЕТЕ, что вы всегда получите тот же строковый формат с аббревиатурами месяца ENG в нем, вы можете использовать следующие преобразование:

DECLARE @DateString nvarchar(50) = N'14-DEC-16 06.23.37.000'; 

WITH cte AS(
SELECT 
    CASE 
    WHEN CHARINDEX('-DEC-', @DateString) > 0 THEN REPLACE(@DateString, '-DEC-', '.12.20') 
    WHEN CHARINDEX('-NOV-', @DateString) > 0 THEN REPLACE(@DateString, '-NOV-', '.11.20') 
    WHEN CHARINDEX('-OCT-', @DateString) > 0 THEN REPLACE(@DateString, '-OCT-', '.10.20') 
    WHEN CHARINDEX('-SEP-', @DateString) > 0 THEN REPLACE(@DateString, '-SEP-', '.09.20') 
    WHEN CHARINDEX('-AUG-', @DateString) > 0 THEN REPLACE(@DateString, '-AUG-', '.08.20') 
    WHEN CHARINDEX('-JUL-', @DateString) > 0 THEN REPLACE(@DateString, '-JUL-', '.07.20') 
    WHEN CHARINDEX('-JUN-', @DateString) > 0 THEN REPLACE(@DateString, '-JUN-', '.06.20') 
    WHEN CHARINDEX('-MAY-', @DateString) > 0 THEN REPLACE(@DateString, '-MAY-', '.05.20') 
    WHEN CHARINDEX('-APR-', @DateString) > 0 THEN REPLACE(@DateString, '-APR-', '.04.20') 
    WHEN CHARINDEX('-MAR-', @DateString) > 0 THEN REPLACE(@DateString, '-MAR-', '.03.20') 
    WHEN CHARINDEX('-FEB-', @DateString) > 0 THEN REPLACE(@DateString, '-FEB-', '.02.20') 
    WHEN CHARINDEX('-JAN-', @DateString) > 0 THEN REPLACE(@DateString, '-JAN-', '.01.20') 
    END AS DateString 
) 
SELECT DateString, 
     CONVERT(datetime, RIGHT(LEFT(DateString, 10),4)+'-'+SUBSTRING(LEFT(DateString, 10),4,2)+'-'+LEFT(LEFT(DateString, 10),2) + 
         REPLACE(LEFT(RIGHT(DateString,13),9),'.',':') + RIGHT(DateString, 4)) AS MyDate 
    FROM cte 

Я определил @DateString, но здесь вы также можете использовать псевдоним столбца.

+0

Как использовать это в ssis – user7434607

+0

Одним довольно быстрым и грязным подходом может быть просто выполнить его как «Выполнять задачу SQL» и извлечь результат в переменную. Другая возможность заключалась бы в создании производного столбца и использовании специальной обработки строки SSIS в выражении в этом столбце. – Tyron78

Смежные вопросы