2013-07-29 61 views
0

我有一種情況需要一些建議。沒有代碼,因爲我想查看它並自己弄清楚。這只是一個學術問題。將單獨的日期和時間列組合成一列

我每天,我要裝載到表得到一個平坦的文件下面是該文件的一個片段:

Date-YYYMMDD TIME 
20091124|  01:19:00|... 
20091124|  01:19:15|... 

這兩個字段的日期和時間。當我這個數據加載到數據庫中,其結果是這些:

Date-YYYMMDD TIME 
20091124  1899-12-30 01:19:00.000 
20091124  1899-12-30 01:19:15.000 

我有合併的結果是數據視圖:

datetime     yearmonthday 
2009-11-24 01:19:00.000 2009-11-24 
2009-11-24 01:19:15.000 2009-11-24 

我做這方面的努力,使鄉親需要這些數據不必與日期和文本字段應該是日期,但不是。

問題是我不喜歡在視圖中這樣做。我寧願將它正確存儲在原始表中。我在想,對於插入的每一行,我都會攔截該插入,然後進行合併,然後以正確的格式插入到表中。完成後,我可以放棄視圖。有沒有最好的辦法呢?像任何優秀的開發人員/管理員我想盡量減少我的干預。我們有電腦來做這種工作。我不控制源文件,也不能對其進行任何更改。我正在考慮插入觸發器。有沒有更好的辦法?儘管在過去幾個月中我使用TSQL做了很多,但我仍然認爲自己是理解TSQL和最有效的方法的初學者。

+0

你怎麼樣將數據加載到數據庫中? –

+0

這是一個相當複雜的過程,我繼承了。我已經做得更好,但它仍然是一個手動過程。 1.通過電子郵件獲取文件(我不會每天加載,每隔幾天做一次就更有意義) 2.修剪掉一些標題行並將所有文件連接到一個文件 3.加載該文件到所有數據映射發生的訪問數據庫 4.通過sql導入器導入訪問表到sql服務器 這不是一個漫長的過程。我正在等待SQL Server 2012在我的環境中可用,然後我將遷移,並且使用sis包時該過程將會更好。我現在沒有這個。 –

+1

跳過訪問。這就是將您的時間值更改爲18991230而不是19000101. –

回答

2

我會說加載到臨時表中。

CREATE TABLE dbo.StagingTable 
(
    Col1 DATETIME, 
    Col2 DATETIME 
); 

將您的數據加載到此表中。如果您的文件與您問題中的文件一樣簡單,那麼您應該可以使用BULK INSERT並刪除大部分手動過程。然後在你的真實表中,有一個DATETIME列。

INSERT dbo.RealTable(DateTimeColumn) 
    SELECT DATEADD(SECOND, DATEDIFF(SECOND, 0, Col2), Col1) 
    FROM dbo.StagingTable; 

-- if successful: 
TRUNCATE TABLE dbo.StagingTable; 

一個更簡單的方法是 - 如果你打開文件,反正修改它們 - 就是要改變這樣的:

Date-YYYMMDD TIME 
20091124|  01:19:00|... 
20091124|  01:19:15|... 

要這樣:

Date-YYYMMDD  |... 
20091124 01:19:00|... 
20091124 01:19:15|... 
+0

所以,你說的是沒有觸發器,並在加載時修復它。我可以做到這一點。我有一個存儲過程,它可以完成很多工作。這是一個好主意。有時我看不到樹林。另外,我會研究'bulk insert'。我很快會有一個更新。 **編輯:**實際上,我只想說明一點。由於我已經擁有大部分結構,因此我可以使該解決方案發揮作用。 –

相關問題