2017-10-14 133 views
0

我的數據庫中有一個日期,它不應該包含年份,所以我需要通過檢查日期來構造正確的日期。 (如果日期尚未今年來,我要定2017年,如果日期已過,我要定2018) (t.myDate是一個可爲空的日期時間)無法構造數據類型日期,某些參數的值無效

SELECT 
    NewDate = CASE 
       WHEN DATEPART(dayofyear, GETDATE()) < DATEPART(dayofyear, t.myDate) 
        THEN DATEFROMPARTS('2017', DATEPART(MONTH,t.myDate), DATEPART(DAY, t.myDate)) 
        ELSE DATEFROMPARTS('2018', DATEPART(MONTH,t.myDate), DATEPART(DAY,t.myDate)) 
       END 
FROM 
    MyTable t 

然而,在一些我收到以下錯誤消息:

無法構造數據類型日期,某些參數的值無效。

我不知道是什麼問題,但我知道有些行是NULL。所以,我曾嘗試使用CASE表達式來解決這個問題簡單地使用今天的日期在哪裏的問題情況:

SELECT 
    NewDate = CASE 
       WHEN t.myDate is null 
        THEN GETDATE() 
       WHEN DATEPART(MONTH,t.myDate) < 1 
        THEN GETDATE() 
       WHEN DATEPART(MONTH,t.myDate) > 12 
        THEN GETDATE() 
       WHEN DATEPART(DAY,t.myDate) < 1 
        THEN GETDATE() 
       WHEN DATEPART(DAY,t.myDate) > 31 
        THEN GETDATE() 
       WHEN ISDATE(t.myDate) = 0 
        THEN GETDATE() 
       WHEN DATEPART(dayofyear, GETDATE()) < DATEPART(dayofyear, t.myDate) 
        THEN DATEFROMPARTS('2017', DATEPART(MONTH,t.myDate), DATEPART(DAY, t.myDate)) 
       ELSE DATEFROMPARTS('2018', DATEPART(MONTH,t.myDate), DATEPART(DAY,t.myDate)) 
      END 
FROM 
    MyTable t 

但我仍然得到同樣的錯誤。要麼我正在測試錯誤的數據質量問題,要麼CASE表達式沒有按照我預期的那樣工作。

另外:它不利於使用,其中對於空行子句:

WHERE t.myDate IS NOT NULL 

我怎樣才能找到數據的質量問題,以及如何圍繞它得到什麼?

(我使用SQL Server 2012)

回答

1

除了檢查NULL你也可能有問題,今年2月29日。例如,如果您的日期爲2016-02-29,並且您正在嘗試構建日期2017-02-29,您將收到上述錯誤,因爲這不是有效的日期。

一般而言,您可以使用光標循環記錄並在TRY/CATCH內執行您的邏輯。在例外情況下,您可以打印違規數據並檢查問題所在。

+0

謝謝,我會嘗試檢查 – Skywise

+0

是的,它的工作!添加以下作爲第一個CASE子句修復它: 當(DATEPART(MONTH,t.myDate)= 2和DATEPART(DAY,t.myDate)= 29) \t \t THEN DATEFROMPARTS('2018',DATEPART(MONTH, t.myDate),DATEPART(DAY,DATEADD(DAY,-1,t.myDate))) – Skywise

相關問題