Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

FabianoSouza

Expressão CASE não funciona com campo datetime

Recommended Posts

Tenho situações em que minha tab DATAS não terá um registro relacionado da tabela Treinamentos.

Neste caso quero que o valor NULL seja substituído por um hífen. Mas não está funcionando. Aparece sempre NULL (ou a data, quando existe).

SELECT
  TreinamentosCodProprietario
, Treinamentos.TreinamentosTitulo
, Treinamentos.Arquivamento
, DataInicio

FROM Treinamentos 
LEFT OUTER JOIN 

(SELECT MIN(CASE WHEN DatasDataInicio = NULL THEN '-' ELSE DatasDataInicio END) AS DataInicio, DatasCodItem
FROM DATAS 
GROUP BY DatasCodItem, DatasCodServico) AS DT ON DT.DatasCodItem = Treinamentos.TreinamentosCod 


Já fiz testes aplicando a expressão CASE tanto na consulta principal quanto na consulta secundária (tabela derivada).

Não funciona.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use uma function para converter acdatacpara string no ELSE do CASE , devecser isto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que você pode fazer seria converter na chamada do case.

Seu campo é datetime? Se sim, vai dar erro pois o retorno do THEN tem que do msm tipo de campo do WHEN.

Exemplo:

declare @data datetime
set @data = NULL
SELECT case when @data is NULL then '-' else @data end
declare @data datetime
set @data = NULL
SELECT case when convert(varchar(12),@data,103) is NULL then '-' else convert(varchar(12),@data,103) end

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabiano, quando se verifica se uma expressão está sem informação (NULL), o correto é expressão is null. Não utilize expressão = null. Vide ANSI_NULLS.

 

Com relação ao código, eis sugestão:

-- código 1
with DT as (
SELECT DatasCodItem, Min(DatasDataInicio) as DataInicio
  from Datas
  group by DatasCodItem, DatasCodServico
)
SELECT T.CodProprietario,
     T.TreinamentosTitulo,
     T.Arquivamento,
     Coalesce(Convert(char(10), DT.DataInicio, 103), '-') as DataInicio
  from Treinamentos as T
       left outer join DT on DT.DatasCodItem = T.TreinamentosCod;

Se nos explicar qual é o objetivo do código, sugestões mais eficazes poderão ser propostas.

 

_____

linkedin.gif José Diz Belo Horizonte, MG - Brasil

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa!! Salve, galera!
Vocês estão certos. Precisava converter a data.

Consegui construir a minha solução com base nas sugestões e dicas de vocês.

 

 

Muito obrigado a todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.