2016-07-05 4 views
0

Мне нужно преобразовать поле даты, которое находится в формате varchar (DDMMYYYY) в DateTime, используя .Net. Я пробовал ряд решений, но все напрасно. Мой источник для этого поля - это плоский файл, а мой пункт назначения - таблица. Я использую скрипт в пакете SSIS.Преобразование varchar в datetime с использованием сценария VB

Ниже приведен пример:

В столбце SampleDate находится в формате ddmmyyyy. Я конвертирую его в MM/dd/YYYY, чтобы преобразовать его в формат даты и времени.

Dim retString1 As String 
Dim slash As Char = ChrW(&H2F) 
retString1 = Row.SampleDate.Substring(2, 2) & "/" 
Dim retString2 As String 
retString2 = Row.SampleDate.Substring(0, 2) & "/" 
Dim retString3 As String 
retString3 = Row.SampleDate.Substring(4, 4) 
Dim retString4 As String 
retString4 = retString1 & retString2 & retString3 

Dim fromDt As Date = Convert.ToDateTime(retString4) 
fromDt = Row.SampleDate 

P.S. : Я не ищу SQL Query для преобразования, поэтому перед комментированием, пожалуйста, внимательно прочитайте весь вопрос. Я ищу код VB, а не код SQL.

+0

Вы должны действительно проверить, что ответ еще не предоставлен, прежде чем задать новый вопрос: http://stackoverflow.com/questions/21833719/convert-flatfile-column-to-datetime – BIDeveloper

+0

Уважаемый BIDeveloper, если вы считаете, что ответ уже есть, дайте мне знать. Поверьте мне, я все пробовал, но мой код VB не конвертирует формат DDMMYYYY в формат YYYY-MM-DD HH: MM: SS. –

+0

Хотя я не сомневаюсь, что вопрос о том, как преобразовать строку (из плоского/текстового файла) в переменную типа (sub) типа Date, задан раньше, ответ «использовать преобразование с вашего SQL-сервера» неверен , –

ответ

1

Просто переверните fromdt = Row.SampleDate

до

Row.SampleDate = fromdt 

И ваш сценарий должен работать, но см. Ниже, чтобы упростить некоторые, если хотите.

КАК СДЕЛАТЬ ЭТО БЕЗ SCRIPT --see ниже метода сценария

Вы можете сделать это намного проще для себя, если вы используете Derived Column преобразование вместо этого! Преобразование преобразования данных не работает, поскольку оно не позволяет вам манипулировать значением столбца, а скорее только типом данных. Но в выведенном столбце вы можете вырезать строку и передать результат в качестве даты.

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

enter image description here

В производном столбце ваш добавить новый столбец и использовать следующее как выражение (заменяющего DateString с name of your column, содержащей дату в формате ddMMyyyy)

затем использовать это как Expression:

(DT_DATE)(SUBSTRING(DateString,3,2) + "/" + (LEFT(DateString,2) + "/" + RIGHT(DateString,4))) 

(dt_date) может быть переключен на другой формат даты, если вы хотите, и этот тип будет автоматическим lly установить Data Type на Derived Column. Затем на вашей карте destination введите new derived column в destination column вместо оригинальной колонки с source.

enter image description here

Вот именно ваши сделали, нет сценариев.

КАК СДЕЛАТЬ ЭТО скрипт

Для решения маршрута, если вы хотите, чтобы остаться со сценарием и, возможно, придать некоторую дополнительную логику, а не простое преобразования вы можете сделать это через transformationscript component в вашем data flow task. Это произойдет из трансформации derived column выше, но по существу будет делать то же самое только через скрипт. Я делаю шаги здесь, я предполагаю, что вы уже знаете некоторые из них, если кто-то еще споткнется на эту должность.

  • Добавьте компонент сценария, когда вы выбираете «преобразование» и соединить его с вы источник
  • компонент
  • Open Script и перейдите в раздел «Inputs and Outputs» и добавить вывод провести новый столбец и установите тип данных , Новый столбец необходим, потому что вы изменяете типы данных

enter image description here

  • перейти в раздел "Input Columns" и выберите SampleDate колонку

enter image description here

  • вернуться "Script" и выберите Vi sual Basic как ваш язык скриптов.
  • Нажмите «Редактировать сценарий», чтобы начать кодирование.
  • Прокрутите страницу вниз, пока не найдете sub Input0_ProcessInputRow(ByVal Row..., где вы поместите свой код.

Этот код работает:

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer) 

    If Not Row.SampleDate_IsNull Then 

     Row.DerivedDate = DateTime.ParseExact(Row.SampleDate, "ddMMyyyy", System.Globalization.CultureInfo.InvariantCulture) 

    End If 
End Sub 

Как @Shiva в комментариях предложил вы могли бы расширить это и использовать TryParseExact или обернуть его в попытке поймать блок, так что если разбор даты не удается, то будет просто очистить/удалите значение из записи, и импорт будет продолжен. Я оставляю это до вас, так как обработка неверных данных - это скорее вопрос требований бизнеса.

+0

'Это все, что вы сделали, никаких сценариев. Вы, конечно, можете сделать это через скрипт, но я не понимаю, почему, когда стандартные параметры доступны для вашего.Ваше решение принимало только «счастливый путь». Исходное поле даты имеет тип 'varchar'. Это означает, что у него могут быть неверные данные. Использование скрипта дает больший контроль над тем, что вы можете сделать «TryParse» в этом поле и преобразовать на дату, только если это будет выполнено. Этот подход, основанный на столбцах, не удался бы, даже если есть действительная дата, которая не является ТОЧНО в формате 'DDMMYYYY'. Тем не менее, я дал +1 за ваши усилия. – Shiva

+1

@Shiva OP четко сказал 1 формат и не упоминает о потенциальных проблемах с действительностью. Я определенно вижу причину использования сценариев для проверки достоверности. Но тогда вопрос в том, что недействительно, что вы хотите делать, все еще импортируете? Это приводит к тому, что должно стоить значение для недопустимой даты? Нуль, что, если пункт назначения не разрешает Nulls, импорт все равно не удастся. В какой-то момент необходимо принять решения о действительности данных и, как правило, я всегда хочу, чтобы они потерпели неудачу, пока я не смогу найти шаблон/обнаружить способы исправления недействительными датами, а не успешными. PS Я использую более сложные скрипты – Matt

+0

Спасибо за разъяснение. Теперь это имеет смысл. – Shiva

0

Чтобы преобразовать строку даты в VBScript вы либо использовать CDate() , который делает преобразование для вас, но зависит от текущих региональных настроек или DateSerial():

>> s = "13041953" 
>> d = DateSerial(CInt(Right(s,4)), CInt(Mid(s,3,2)), CInt(Left(s,2))) 
>> WScript.Echo s, TypeName(d), d 
>> 
13041953 Date 13.04.1953 (german locale) 
Смежные вопросы