2016-07-05 102 views
0

我需要使用.Net將日期字段以varchar格式(DDMMYYYY)轉換爲DateTime。我嘗試了許多解決方案,但都徒勞無功。我的來源是一個平面文件,我的目標是一張桌子。我在SSIS包中使用腳本。使用VB腳本將varchar轉換爲datetime

下面是示例:

列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

雖然我不懷疑如何將字符串(從平面/文本文件)轉換爲(子)類型Date的變量的問題之前已被問到,答案「使用從您的SQL Server轉換」是錯誤的。 –

回答

1

只需掀開fromdt = Row.SampleDate

Row.SampleDate = fromdt 

你的腳本應該可以工作,但如果你想要的話,請看下面的內容。

HOW TO DO IT沒有劇本--see下面的腳本方法

你可以,如果你使用Derived Column轉型,而不是讓這個簡單了很多自己!數據轉換轉換不起作用,因爲它不允許您操縱列的值,而只能處理數據類型。但是在派生列中,您可以剪切字符串並將結果作爲日期進行投射。

因此,在您的數據流中源到派生列到目的地。

enter image description here

在派生列的添加新的列,並使用下列作爲表達式

然後使用此作爲Expression(用含有ddMMyyyy格式的日期name of your column替換DateString):

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

(dt_date)可以切換爲另一種日期格式,如果您願意並且該類型轉換將自動執行a在Derived Column上設置Data Type。然後在您的destinationnew derived column映射到destination column而不是您的source的原始列。

enter image description here

就是這樣做的,沒有劇本。

HOW TO DO IT通過腳本

爲了解決途徑,如果你想留一個腳本,也許注入一些額外的邏輯,而不是簡單的轉換就可以通過在一個transformationscript component做你data flow task。它將取代上述的derived column轉換,但基本上只能通過腳本完成相同的操作。我在這裏採取措施,我猜你已經知道一些在別人絆倒在帖子上的情況。

  • 添加腳本組件一旦你選擇了「轉型」,並與您連接源
  • 打開腳本組件,然後轉到「Inputs and Outputs」部分,並添加一個輸出持有新列,並設置數據類型。一個新列是必要的,因爲你正在改變數據類型

enter image description here

  • 去 「Input Columns」 部分,選擇SampleDate

enter image description here

  • 回去「Script」部分並選擇Vi作爲腳本語言的基礎。
  • 點擊Edit Script開始編碼。
  • 向下滾動直到找到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或在try catch塊包起來,這樣,如果解析日期失敗,只會清晰/從記錄中刪除值並導入將繼續。由於處理無效數據更多地是業務需求的問題,所以我會將其留給您。

+0

'這是你完成的,沒有腳本。你當然可以通過腳本來完成,但我不明白爲什麼當標準選項可用於你的'。您的解決方案只能採用「快樂之路」。源日期字段的類型是'varchar'。這意味着它也可能有無效的數據。使用腳本提供了更大的控制,因爲您可以在該字段上執行'TryParse'並僅在成功時轉換爲日期。即使存在有效的日期,這種派生列方法也會失敗,這不完全是'DDMMYYYY'格式。這就是說,我爲你的努力給了+1。 – Shiva

+1

@Shiva OP明確表示1格式,並沒有提到潛在的有效性問題。我完全可以看到使用腳本任務來測試合法性的原因。但問題是如果無效你想要做什麼,仍然導入?那導致無效日期的價值應該是什麼?如果目標不允許空值,那麼導入仍然會失敗.....在某些情況下,需要做出數據有效性的決定,通常我會希望它們失敗,直到找到模式/發現糾正方法無效的日期而不是悄悄地成功。 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)