2012-04-26 55 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