2016-08-01 4 views
4

У меня есть формат даты и времени:формат даты и времени в SSIS

Interval Start Time 
1/13/16 1:30:00 
1/15/16 10:30:00 

Желаемая Result

Interval Start Time 
13/01/2016 13:30:00 (24 Hr) 
15/01/2016 10:30:00 

Интервал времени между 08:00 до 17:30.

Я хотел бы, чтобы это было: 13/01/2016 13:30 и 15/01/2016 10:30:00 и я придумал это в SSIS производном Колонка:

(DT_DATE)(SUBSTRING([Interval Start Time],3,2) + "-" + 
SUBSTRING([Interval Start Time],1,1) + "-" + 
SUBSTRING([Interval Start Time],6,2) + " " + 
SUBSTRING([Interval Start Time],9,1) == 1 ? "13" : 
SUBSTRING([Interval Start Time],9,1) == 2 ? "14" : 
SUBSTRING([Interval Start Time],9,1) == 3 ? "15" : 
SUBSTRING([Interval Start Time],9,1) == 4 ? "16" : 
SUBSTRING([Interval Start Time],9,1) == 5 ? "17" : 
"[Interval Start Time]") 
+ ":" + SUBSTRING([Interval Start Time],11,2)) 

Я получаю ошибку в SSIS является:

... выражение может содержать недопустимый маркер, неполный маркер или недопустимый элемент ...

, и я не уверен, что если формула верна в чем Я хочу, чтобы это произошло ее. Любая помощь приветствуется.

+0

последние круглые скобки ')' для удаления ... –

+0

'SUBSTRING ([Interval Start Time], 11,2))' как @alex говорит, удалите последнюю скобку, так что это 'SUBSTRING ([Interval Start Time], 11,2)', но я думаю, что вы все равно будете получать ошибки с равенство '== 1, == 2, == 3 ...' проверяется, когда вы сравниваете тип строки и числовой тип. Каким типом данных является это '[Interval Start Time]' хранимое как и в какой СУБД? –

+0

Что такое тип данных для '[Interval Start Time]'? Это тип «STRING» или «DATETIME»? – Shiva

ответ

1

Прежде чем представить возможное решение здесь, я хочу, чтобы вы знали о некоторых ошибках в своем подходе. Использование выражений для этого запроса очень сложно и сложно поддерживать, кроме того, что происходит, когда ваш столбец Interval Start Time имеет даты с октября (10) по декабрь (12) месяцев, длина строки будет изменяться, и ваше жестко запрограммированное решение через вызовы SUBSTRING вернет абсурдные данные и произвести ошибку во время работы пакета.

РЕШЕНИЕ: Использовать скриптовый компонент.

  1. После создания источника добавьте компонент скрипта и свяжите источник с ним.
  2. Настройте компонент «Сценарий», чтобы включить столбец Interval Start Time, выбрав его в поле «Input Columns».
  3. Добавьте выходной столбец, назовите его так, как вы хотите, и выберите временную метку базы данных (DT_DBTIMESTAMP). enter image description here
  4. Перейдите на вкладку «Сценарий» и нажмите кнопку «Редактировать сценарий ...».
  5. Используйте приведенный ниже код, чтобы переписать функцию Input0_ProcessInputRow.

    public override void Input0_ProcessInputRow(Input0Buffer Row) 
    { 
        /* 
        * Add your code here 
        */ 
        var str_timestamp = Row.IntervalStartTime.ToString(); 
        string[] arr = str_timestamp.Trim().Split(' '); 
        string[] date = arr[0].Split('/'); 
        string[] time = arr[1].Split(':'); 
    
        string formatedDate = "20" + date[2] + "-" + date[0].PadLeft(2, '0') + "-" + date[1].PadLeft(2, '0'); 
        int hour = Convert.ToInt32(time[0]); 
        int hour_24 = hour < 8 ? hour + 12 : hour; 
        formatedDate += " " + hour_24 + ":" + time[1] + ":" + time[2]; 
    
        Row.MyColumn = Convert.ToDateTime(formatedDate); 
    
    } 
    
  6. В Row.MyColumn заменить MyColumn по данному имени вашего выходного столбца.

  7. Сохраните изменения в Visual Studio и закройте редактор.

Теперь вы можете добавить пункт назначения после компонента Script, и вы увидите отформатированный IntervalStartTime по мере необходимости.

enter image description here

Позвольте мне знать, если это помогает.

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