2012-04-26 59 views
3

我的查詢中有一個日期時間列,我想在此查詢中執行一個CASE。使用DateTime列的CASE語句

如果DateDelivered列不爲空,則顯示日期,否則顯示字符串'Pendent' 我該怎麼做?

CASE WHEN DateDelivered IS NOT NULL THEN DateDelivered ELSE 'Pendent' END AS DateDelivered 2 

我得到這個錯誤

Conversion failed when converting date and/or time from character string. 

SELECT San_Imovel.Imovel_Id , 
     San_Chave.DataHoraPegou , 
     CASE WHEN San_Chave.DateDelivered IS NOT NULL THEN San_Chave.DateDelivered 
      ELSE ISNULL(CAST(San_Chave.DateDelivered AS VARCHAR), 'Pendent') 
     END AS DateDelivered2 , 
     San_Usuario.NomeCompleto + ' - ' + sc.Apelido AS Nome , 
     San_Cliente.NomeCompleto AS NomeCliente , 
     San_Credenciada.Apelido , 
     San_Cliente.Cliente_Id , 
     San_ChaveImovel.QuantidadeChave 
FROM San_ChaveImovel 
     JOIN San_Chave ON San_ChaveImovel.Chave_Id = San_Chave.Chave_Id 
     JOIN San_Credenciada ON San_Chave.Credenciada_Id = San_Credenciada.Credenciada_Id 
     JOIN San_Imovel ON San_ChaveImovel.Imovel_Id = San_Imovel.Imovel_Id 
     JOIN San_Usuario ON San_Chave.Usuario_Id_Responsavel = San_Usuario.Usuario_Id 
     JOIN San_Credenciada sc ON San_Usuario.Credenciada_Id = sc.Credenciada_Id 
     JOIN San_Cliente ON San_Chave.Cliente_Id = San_Cliente.Cliente_Id 
+0

什麼是整個查詢? – 2012-04-26 16:52:47

+0

@mostymostacho更新 – 2012-04-26 17:00:32

回答

6

你試圖「吊墜」轉換爲是DateTime,因爲它要全部轉換數據的整個查詢是相同的數據類型。另外,如果你只是檢查NULL,你可以使用ISNULL或COALESCE。試試這個:

ISNULL(CAST(DateDelivered AS VARCHAR), 'Pendent') 

您也可以指定格式DateDelivered:

ISNULL(CONVERT(VARCHAR, DateDelivered, 101), 'Pendent') 

查看更多選項101 here

+0

我嘗試了,並得到了相同的錯誤 – 2012-04-26 16:54:34

+0

您是否正在轉換或轉換?這是這一過程的重要組成部分。 – zimdanen 2012-04-26 16:56:42

+0

我tryied,兩種類型,但返回相同的錯誤。 CASE當DateDelivered不爲NULL那麼DateDelivered ELSE ISNULL(CAST(DateDelivered AS VARCHAR),'Pendent')END AS DateDelivered2 – 2012-04-26 16:57:54

2

CASE運算符返回的值與第一個結果子句的類型和大小相同。使用ISNULL

CASE WHEN DateDelivered IS NOT NULL THEN CONVERT(VARCHAR(10), DateDelivered, 120) 
ELSE 'Pendent' 
END AS DateDelivered 

在這個例子中,你可以得到相同的結果:

ISNULL(CONVERT(VARCHAR(10), DateDelivered, 120), 'Pending') AS [DateDelivered] 

正如你不能將「待處理」的日期時間值,必須將日期值轉換爲他們的VARCHAR表示注1:將日期值轉換爲varchar時,我總是更喜歡YYYY-MM-DD的順序,因爲它不是一個不明確的格式。

注2:請注意,濫用CASE可以導致更微妙的錯誤基礎上,第一條結果的大小,當它截斷VARCHAR值:

CASE WHEN 1=0 THEN 'A' 
ELSE 'BBB' 
END -- returns only 'B' !!! 
+1

在Note 2上,與ISNULL相同:ISNULL(@ Varchar1,@ Varchar3)將返回LEFT(@ Varchar3,1)。 – zimdanen 2012-04-26 19:09:44