2016-08-31 4 views
0

SSMSで1900-01-01を返すクエリがありますが、CASE WHEN1900-01-01に置き換えて正確にはどのように使用できますか(空白ではない)。SQL Server:Nullの日付時刻を変換する

CAST(ISNULL(CAST(CONVERT(DATE, cmmt.[CmmtExpirationDate], 101) AS NVARCHAR(20)), '') AS DATE) AS [Cmmt Expiration Date] 

結果:1900-01-01

私はこれを試してみましたが、運(ひどい構文):

CASE 
    WHEN (CAST(ISNULL(cast(convert(Date, cmmt.[CmmtExpirationDate] , 101) as nvarchar(20)), '') = '1900-01-01') 
     THEN '' 
     ELSE CAST(ISNULL(cast(convert(Date, cmmt.[CmmtExpirationDate] , 101) as nvarchar(20)),'') AS DATE 
END 
+0

できません。空の文字列は、1900-01-01のdatetimeへの暗黙的な変換を強制します。ここのデータ型は日付であり、空文字列は有効な日付ではないことを覚えておく必要があります。日付がないときに空の文字列を表示する場合は、フロントエンドで行う必要があります。 –

+0

あなたはすべての後に 'DATE'に変換しようとしています。空の文字列を' DATE'として持つことはできません( '1900-01-01'に変換します)。 – Lamak

+0

' CmmtExpirationDate '? – Heinzi

答えて

1

あなたの式の結果は、固定されたデータ型を持っている必要がありません。 ''は有効な日付ではないため、DATEは使用できません。 nvarchar(20)はオプションですが、でない場合でも結果は文字列になります。1900-01-01ではありません。あなたがそれを受け入れると

は、解決策は単純です:

CASE WHEN cmmt.[CmmtExpirationDate] = '1900-01-01' 
    THEN CONVERT(nvarchar(20), cmmt.[CmmtExpirationDate]) 
    ELSE CONVERT(nvarchar(20), '') 
END 

は、あなたが最初のCONVERTの文の3番目のパラメータとしてdesired output formatを指定したい場合があります。

(私はそれがない場合には、それは問題で言及されているはずなのでCmmtExpirationDateは、タイプDATEであることを前提としています。)

+0

オペアンプが「CONVERT(DATE、cmmt。[CmmtExpirationDate]、101)」を実行しているためではありません。 – Lamak

+0

日付をこのような文字列。クライアント側でソートすると、日付文字列の形式に応じて正確にソートすることができなくなります。 –

+0

@Lamak:もし既に文字列であれば、その解決策はCASE WHEN ... = '1900-01-01' THEN ... ELSE '' END'です。 – Heinzi

0

あなたは以下のようにtry_convert使用することができます。

try_convert(date, case when datecolumn='' then null else datecolumn end) 
関連する問題