2

我有一张包含超过 13,8k 行的巨大表格。它的布局类似于,

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)

然后我做了一个光标,在我执行它之前我关闭了

SET IDENTITY_INSERT navneregister on

光标看起来像这样,但有趣的是我将三个字段解析为一个新的 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。还有很多特殊情况,比如设置了年份,但设置了月份和日期,并且我的计划是将年份设置为 0000。此外,在某些情况下,所有三个字段都为空。还有能提供一些好的建议的人吗?

4

1 回答 1

0

你想达到什么目的?如果你有坏数据进来,你想出去什么数据?此外,没有“0000 年”,因为没有 0 年。这使您处于一个有趣的位置:如果您故意制造虚假日期,您打算如何处理它们?如果你有一个月和一天,你可以按月和天(有点)对数据进行分组,但是当有人想要找到最早或最新的记录时会发生什么?哎呀。真的不能那样做。

13,8K 行实际上非常小,所以我想知道您是否有日志或周围的任何东西可以让您重建丢失的数据?试图从坏数据中创建“好”数据几乎总是意味着有人会出现并假设你的数据是可靠的,而实际上它并不可靠。确定这些数据的用例,并尝试找出哪些不能处理不完整的数据并从那里着手。

此外,您是否可以选择消除包含错误数据的行?无论如何,假设日期很重要,您可能无能为力。

于 2012-04-26T10:11:08.027 回答