web-dev-qa-db-ja.com

値が日付かどうかを確認し、変換します

特定の形式でデータを受信します。日付は数値(8,0)です。たとえば20120101 = YYYYMMDD

その日付フィールドに(0,1,2,3,6)のような値を持つ行が存在するため、日付ではありません。

それが日付であるかどうかを確認して変換したいのですが、それ以外の場合はnullでもかまいません。

これで次のコードは機能しますが、もっと良い方法があることを望んでいました。

(CASE WHEN [invoice_date] LIKE '________' --There are 8 underscores
 THEN convert(datetime, cast([invoice_date] as char(8)))
 END) AS Invoice_Date

どんな助けでもありがたいです。

12
Inus C

..のようなisdate関数を使用します。

  (CASE WHEN ISDATE (invoice_date) = 1 
             THEN convert(datetime, cast([invoice_date] as char(8)))
             END) AS Invoice_Date
22
Deniyal Tandel

ISDATE関数を使用できますが、日付以外の値はどうなりますか?私が提案する解決策では、nullを返すように選択できます。

select 
    (case 
        when ISDATE (invoice_date)=1
        then convert(datetime, invoice_date)
    else null end) AS Invoice_Date
from your_table
6
von v.

[〜#〜] isdate [〜#〜]

式が有効な日付、時刻、または日時の値である場合は1を返します。それ以外の場合は0。式がdatetime2値の場合、ISDATEは0を返します。

ご覧ください

2
user2358092

TRYCATCHで行くことができます

DECLARE @Source             char(8)
DECLARE @Destination        datetime

set @Source='07152009'
BEGIN TRY
    SET @Destination=CONVERT(datetime,RIGHT(@Source,4)        -- YYYY
                                      +LEFT(@Source,2)        -- MM
                                      +SUBSTRING(@Source,3,2) -- DD
                             )
END TRY
BEGIN CATCH
    PRINT 'ERROR!!!'  
END CATCH

SELECT @Source AS Source, @Destination AS Destination
0
kiriloff