2017-10-14 28 views
0

データベースに日付が含まれているはずなので、日付をチェックして正しい日付を作成する必要があります。 (日付は今年まだ来ていない場合には、私は日が経過した場合、私は2018を設定する、2017を設定したい) (t.myDateがNULL可能日時です)データ型の日付を構成できません。一部の引数に無効な値があります。

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式が期待通りに機能していません。また

:それはNULL行のwhere句を使用することを助けていません:

WHERE t.myDate IS NOT NULL 

にはどうすればデータ品質の問題を見つけることができる、そしてどのように私はそれを回避することができますか?

(私はSQL Server 2012のを使用しています)

答えて

1

別にNULLのチェックから、あなたはまた、2月の29日に問題があることがあります。たとえば、日付2016-02-29があり、日付2017-02-29を作成しようとしている場合、これは有効な日付ではないため、上記のエラーが発生します。

一般にカーソルを使用してレコードをループし、ロジックをTRY/CATCH内で実行することができます。例外として、問題のあるデータを印刷して、問題の内容を確認することができます。

+0

ありがとう、私はそれを確認しようとします – Skywise

+0

はい、それは働いた! WHAT(DATEPART(MONTH、t.myDate)= 2 AND DATEPART(DAY、t.myDate)= 29) \t \tその後、DATEPROMPARTS( '2018'、DATEPART(MONTH、 tMyDate)、DATEPART(DAY、DATEADD(DAY、-1、t.myDate))) – Skywise

関連する問題