2012-04-26 117 views
2

我是一個巨大的表,包含超過13,8k行。它的佈局是一樣的東西,在Ms SQL Server 2008中的三個字段中創建datetime2

CREATE TABLE table1(
[id] [int] NOT NULL, 
[regnr] [char](10) NULL, 
[kilde] [char](100) NULL, 
[dd] [char](10) NULL, 
[mm] [char](10) NULL, 
[yyyy] [char](16) NULL, 

新表,其中日期部分是清理將佈局尚且如此,加上其他領域是不重要的。

create table table2(id int primary key identity not null, regnr nvarchar(10), kilde nvarchar(100), dato datetime2) 

我已經然後做了光標和befor我執行它,我關閉

SET IDENTITY_INSERT navneregister on 

光標這個樣子的,但interresting的事情,我的三個字段的解析到一個新的DATETIME2。

declare @id int, @regnr nvarchar(10), @kilde nvarchar(100), @composeddate nvarchar(max), @dd char(10), @mm char(10), @yyyy char(16) 
declare p cursor 
for select id, regnr, kilde, dd, mm, yyyy from table2 
open p 
fetch p into @id, @regnr, @kilde, @dd, @mm, @yyyy 
while @@FETCH_STATUS != -1 
    begin 
    begin 
    if((@mm = '0' or @mm = '00') and (@dd = '0' or @dd = '00') and (@yyyy ='0000')) 
     set @composeddate = null 
    end 
    if(@mm = '0' or @mm = '00') 
     set @mm = '01' 
    if(@dd = '0' or @dd = '00') 
     set @dd = '01' 

    begin 
    if(@yyyy = '') 
     set @composeddate = null 
    else 
     set @composeddate = CAST(CAST(@yyyy AS char(16)) + '-' + CAST(@mm AS char(10)) + '-' + CAST(@dd AS char(10)) AS DATETIME2) 
    end 
    begin 
     insert into table1(id, regnr, kilde, dato) 
     values (@id, @regnr, @kilde, @composeddate) 
    end 
    fetch p into @id, @regnr, @kilde, @dd, @mm, @yyyy 
    end 
close p 
deallocate p 

我工作的一部分,但也有它失敗了一些邊緣的情況下,例如,如果DD = 00,MM = 00和YYYY = 0000 也有像在今年AINT一套特殊情況下的負載,但是設置了月和日,我的計劃是將年設置爲0000. 也有一些情況下,所有三個字段都是空的。誰能提供一些好的建議?

+0

你在介紹性敘述和遊標代碼之間混淆了'table1'和'table2'(並沒有注意到你還在'SET IDENTITY_INSERT'中包含了一個真實的表名)。但是我已經清理了代碼格式。 – 2012-04-26 13:10:13

回答

0

你想完成什麼?如果你有不好的數據進來,你想要出去的數據是什麼?此外,沒有「0000年」,因爲there is no year 0。這讓你處於一個有趣的位置:如果你刻意製造虛假的日期,你打算如何處理它們?如果你有一個月和一天的時間,你可以按月份和日期(有點)分組數據,但當有人想要找到最早或最新的記錄時會發生什麼?哎呀。不能這樣做。

13,8K行實際上非常小,所以我想知道你是否有日誌或任何東西躺着,這將允許你重建丟失的數據?試圖從不良數據創建「好」數據幾乎總是意味着有人會出現,並假設你的數據不可靠時就是可靠的。找出這些數據的使用案例,並嘗試找出哪些數據不適用於不完整的數據,然後從中繼續。

另外,您是否可以選擇消除數據不良的行?無論如何,你可以做的事情不多,假設日期很重要。

+0

Tkx爲您提供幫助。但我已經放棄了這個問題 – 2012-05-03 09:08:10