Конвертировать varchar в datetime, используя скрипт VB
Мне нужно конвертировать поле даты в формате varchar (DDMMYYYY)
DateTime с использованием.Net. Я попробовал несколько решений, но все тщетно. Мой источник для этого поля - плоский файл, а мой пункт назначения - таблица. Я использую скрипт в пакете служб SSIS.
Ниже образец:
Столбец 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
PS: я не ищу SQL Query для конвертации, поэтому, прежде чем комментировать, внимательно прочитайте весь вопрос. Я ищу код VB, а не код SQL.
2 ответа
Просто переверните fromdt = Row.SampleDate
в
Row.SampleDate = fromdt
И ваш сценарий должен работать, но смотрите ниже, чтобы упростить некоторые, если хотите.
Как это сделать без сценария - см. Ниже метод сценария
Вы можете сделать это намного проще для себя, если вы используете Derived Column
преобразование вместо! Преобразование преобразования данных не работает, потому что оно не позволяет вам манипулировать значением столбца, а только типом данных. Но в производном столбце вы можете вырезать строку и привести результат к дате.
Таким образом, источник к производному столбцу к месту назначения в вашем потоке данных.
В производном столбце добавьте новый столбец и используйте следующее как выражение (заменяя DateString
с name of your column
содержащий дату в ddMMyyyy
формат)
Затем используйте это как Expression
:
(DT_DATE)(SUBSTRING(DateString,3,2) + "/" + (LEFT(DateString,2) + "/" + RIGHT(DateString,4)))
(dt_date)
при желании можно переключиться на другой формат даты, и приведение типа автоматически установит Data Type
на Derived Column
, Тогда в вашем destination
сопоставить new derived column
к destination column
вместо вашей исходной колонки из вашего source
,
Все готово, никаких сценариев.
Как это сделать через сценарий
Чтобы указать маршрут, если вы хотите остаться со сценарием и, возможно, внедрить некоторую дополнительную логику вместо простого преобразования, вы можете сделать это с помощью transformation
script component
в вашем data flow task
, Это будет происходить из derived column
преобразование выше, но, по сути, будет делать то же самое только через скрипт. Я делаю здесь шаги, которые, я думаю, вы уже знаете некоторые из них на случай, если кто-то еще наткнулся на пост.
- Добавьте компонент скрипта, когда вы выберете "преобразование" и подключите его к исходному коду
- Откройте компонент Script и перейдите к
Inputs and Outputs
"и добавьте вывод для хранения нового столбца и установки типа данных. Новый столбец необходим, потому что вы меняете типы данных
- идти к "
Input Columns
раздел и выберитеSampleDate
колонка
- вернуться к "
Script
"и выберите Visual Basic в качестве языка сценариев. - Нажмите Edit Script, чтобы начать кодирование.
- Прокрутите вниз, пока не найдете суб
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 или обернуть его в блок try catch, чтобы в случае неудачного анализа даты он просто очистил / удалил значение из записи, и импорт продолжился. Я оставляю это на ваше усмотрение, так как обработка недействительных данных - это больше вопрос бизнес-требований.
Чтобы преобразовать строку в дату в 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)