我一直无法弄清楚如何正确转换数据。目前的形式是 varchar,数据如下:
19260200, 19770900, 20030400, 20120300, 20020500,
如您所见,我有年份和月份,但没有日期值。当我尝试将其插入格式化为日期时间的 SQL 字段中时,我得到了错误。任何人都知道我该如何解决这个问题?我正在使用一个包含 700,000 条记录的数据库,因此我需要能够编写一些代码来解决它,而不仅仅是手动完成和更改。
在此先感谢您的帮助!!!
我一直无法弄清楚如何正确转换数据。目前的形式是 varchar,数据如下:
19260200, 19770900, 20030400, 20120300, 20020500,
如您所见,我有年份和月份,但没有日期值。当我尝试将其插入格式化为日期时间的 SQL 字段中时,我得到了错误。任何人都知道我该如何解决这个问题?我正在使用一个包含 700,000 条记录的数据库,因此我需要能够编写一些代码来解决它,而不仅仅是手动完成和更改。
在此先感谢您的帮助!!!
INSERT dbo.destination(date_column)
SELECT dt FROM
(
SELECT dt = CASE
WHEN src_date_column LIKE '%00' THEN
STUFF(src_date_column, 8, 1, '1')
ELSE src_date_column
END
FROM dbo.source
) AS x
WHERE ISDATE(dt) = 1;
处理评论:
AS x
只是一个别名。派生表需要被称为某些东西。如果你只是说:
SELECT x FROM (SELECT x = 1);
你得到这个无用的错误:
消息 102,级别 15,状态 1
';' 附近的语法不正确。
但如果你说:
SELECT x FROM (SELECT x = 1) AS y;
至于您的其他问题,您可以简单地将其他列添加到内部SELECT
,例如:
INSERT dbo.Citation(PatentNo, Citation, CitedBy, CitationDate)
SELECT PatentNo, Citation, WhoCitedThis, dt
FROM
(
SELECT PatentNo, CitationSource, WhoCitedThis, dt = CASE
WHEN CitationDate LIKE '%00' THEN STUFF(CitationDate, 8, 1, '1')
ELSE CitationDate
END
FROM dbo.CitationSource
) AS x
WHERE ISDATE(dt) = 1;
现在,您需要决定要如何处理无效日期,例如 20120231 或 20120399。这些都被抛在了后面。我的第一个建议是创建一个适当的日期或日期时间列,并首先拒绝糟糕的日期进入系统。
你可以尝试这样的事情:
cast(left(val, 6)+'01') as date)
也就是说,在字符串中插入一个有效的日期值并进行转换。