2012-07-17 54 views
1

我一直無法找出如何正確轉換數據。在其目前的形式,它是VARCHAR和數據如下:SQL日期轉換爲8個字符值00作爲天

19260200, 19770900, 20030400, 20120300, 20020500,

所以你可以看到我有一年個月,但有日期沒有值。當我嘗試將其插入到格式爲datetime的SQL字段中時,我收到錯誤。任何人都知道我可以解決這個問題?我正在處理700,000條記錄的數據庫,因此我需要能夠編寫一些代碼來解決它,而不僅僅是手動完成並更改。

在此先感謝您的幫助!

+0

那麼你想插入什麼,每個月的第一天時間是'00'? – 2012-07-17 02:01:19

回答

1
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); 

你得到這個無用的錯誤:

Msg 102, Level 15, State 1
Incorrect syntax near ';'.

但如果你說:

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.那些只是落伍了。我的第一個建議是,製作一個適當的日期或日期時間欄,並拒絕首先進入系統的錯誤日期。

+0

工作很好! 「AS x」是指什麼?我對SQL仍然相當陌生,想盡可能多地學習 – 2012-07-17 05:15:29

+0

另一個問題是我如何在現有插入代碼中插入代碼: 'insert into Citation(PatentNo,Citation,CitedBy) 選擇專利號,引文,whocitedthis 從citationsource ' 的上面的修改後的版本在測試DB工作是: ' INSERT引文(citationdate) SELECT DT FROM ( SELECT DT = CASE WHEN citationDate LIKE「% 00'THEN STUFF(CitationDate,8,1,'1') ELSE CitationDate END FROM CitationSource )AS x WHERE ISDATE(dt)= 1;' – 2012-07-17 05:30:06

+0

這對我來說更有意義,謝謝@Aaron Bertrand。問題不是無效的日期只是填充平面文件然後帶入SQL的XML文件的日期添加日期00,因爲它是空白的。我認爲在SQL中糾正這個問題會更容易,然後是別人之前寫過的python程序。 – 2012-07-17 18:45:28

0

你可以嘗試這樣的事情:

cast(left(val, 6)+'01') as date) 

也就是說,插入一個有效日期值轉換成字符串並做轉換。

相關問題