Usuário com melhor resposta
Calculando valores nulos em colunas com alias

Pergunta
-
Boa noite galera
Vamos la, tenho a seguinte tabela(TarefasXPausas) no meu ambiente
id Id_Tarefa datainicio DataTermino Duracao 10825 139546 2011-03-01 19:51:00.000 2011-03-02 16:11:00.000 491 10826 139822 2011-03-03 11:52:42.000 NULL NULL 10827 139819 2011-03-03 11:53:05.000 NULL NULL 10828 139827 2011-03-03 11:53:17.000 NULL NULL 10829 139831 2011-03-03 11:53:27.000 NULL NULL 10830 139515 2011-03-03 11:53:40.000 NULL NULL 10831 139664 2011-03-03 15:13:44.000 NULL NULL 10832 139485 2011-03-03 15:22:47.000 NULL NULL 10833 139701 2011-03-03 15:23:31.000 NULL NULL 10834 140284 2011-03-04 14:55:41.000 2011-03-04 14:57:21.000 2 10835 140064 2011-03-04 16:17:32.000 2011-03-04 16:20:53.000 3
Extrai as 11 primeiras linhas por meio do: select top 11 id, Id_Tarefa, datainicio, DataTermino, Duracao from TarefasXPausas
Sobre a tabela: Nessa tabela a coluna Duracao(refere-se a minutos) tira uma diferença entre o tempo que tiver preenchido da coluna DataTermino e DataInicio, como comparação olhar a primeira linha e as ultimas linhas e veram que o tempo de duração corresponde. A coluna Duracao não é uma coluna computada, ela é preenchida por um aplicativo e este fica incumbido de realizar o calculo quando se é preenchido algo na coluna DataTermino.
Pois bem, na coluna Duracao é apresentado tbm valores nulos pois não foi preenchida a coluna DataTermino, para resolver estou executando o seguinte select:
- select top 11 id, Id_Tarefa, DataInicio, isnull(DataTermino, GETDATE()) as [ValHoje],Duracao from TarefasXPausas
id Id_Tarefa datainicio DataTermino Duracao 10825 139546 2011-03-01 19:51:00.000 2011-03-02 16:11:00.000 491 10826 139822 2011-03-03 11:52:42.000 2012-08-24 19:51:30.943 NULL 10827 139819 2011-03-03 11:53:05.000 2012-08-24 19:51:30.943 NULL 10828 139827 2011-03-03 11:53:17.000 2012-08-24 19:51:30.943 NULL 10829 139831 2011-03-03 11:53:27.000 2012-08-24 19:51:30.943 NULL 10830 139515 2011-03-03 11:53:40.000 2012-08-24 19:51:30.943 NULL 10831 139664 2011-03-03 15:13:44.000 2012-08-24 19:51:30.943 NULL 10832 139485 2011-03-03 15:22:47.000 2012-08-24 19:51:30.943 NULL 10833 139701 2011-03-03 15:23:31.000 2012-08-24 19:51:30.943 NULL 10834 140284 2011-03-04 14:55:41.000 2011-03-04 14:57:21.000 2 10835 140064 2011-03-04 16:17:32.000 2011-03-04 16:20:53.000 3 10836 140307 2011-03-04 16:29:35.000 2011-03-09 12:54:25.000 2395
Com isso ele me exibe na coluna DataTermino a hora atual no que era valor NULL porém ai que entra meu problema eu não estou conseguindo mesmo assim tirar a diferença, por que? A coluna antes que se chamava DataTermino por meio do alias no select chama-se ValHoje.
Para tentar tirar essa diferença tentei usar a função DateDiff mas ela não encontra o alias que declarei. Pesquisei na net tentei usar um WHERE mas sem sucesso. Alguém já passou por isso ou tem uma idéia de como efetuar esse calculo?
Agradeço o auxilio...
- Editado Cleber West sexta-feira, 24 de agosto de 2012 23:10 editei errado
Respostas
-
Cleber,
não dá pra usar o alias como você gostaria. Segue um exemplo de como poderá fazer. Quando a duração estiver preenchida, pegamos ela mesma. Quando não estiver, fazemos um DateDiff entre a data de início e GetDate.
Create Table #Tabela (id int, Id_Tarefa int, DataInicio DateTime, DataTermino DateTime, Duracao int) Insert Into #Tabela Values (10825, 139546, '2011-03-01 19:51:00.000', '2011-03-02 16:11:00.000', 491), (10826, 139822, '2011-03-03 11:52:42.000', NULL, NULL), (10827, 139819, '2011-03-03 11:53:05.000', NULL, NULL), (10828, 139827, '2011-03-03 11:53:17.000', NULL, NULL), (10829, 139831, '2011-03-03 11:53:27.000', NULL, NULL), (10830, 139515, '2011-03-03 11:53:40.000', NULL, NULL), (10831, 139664, '2011-03-03 15:13:44.000', NULL, NULL), (10832, 139485, '2011-03-03 15:22:47.000', NULL, NULL), (10833, 139701, '2011-03-03 15:23:31.000', NULL, NULL), (10834, 140284, '2011-03-04 14:55:41.000', '2011-03-04 14:57:21.000', 2), (10835, 140064, '2011-03-04 16:17:32.000', '2011-03-04 16:20:53.000', 3) Select id, Id_Tarefa, DataInicio, Isnull(DataTermino, GETDATE()) as [ValHoje], Duracao = Case When (Duracao is not Null) Then Duracao Else DateDiff(MINUTE, DataInicio, GetDate()) End From #Tabela
Isso resolve para um simples Select, já que pelo visto você não pode atualizar estas colunas da tabela (com um Update).
Roberson Ferreira - Database Developer
Acesse: www.robersonferreira.com.br
Email: contato@robersonferreira.com.brSe esta sugestão for útil, por favor, classifique-a como útil.
Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.- Marcado como Resposta Cleber West segunda-feira, 27 de agosto de 2012 12:59
-
Olá Cleber,
tente usar o case when
ficaria mais ou menos assim
select top 11 id, Id_Tarefa, DataInicio, isnull(DataTermino, GETDATE()) as [ValHoje],
(CASE WHEN DataTermino is NOT null then Duracao else DATEDIFF(MINUTE,DataInicio,GETDATE()) END) Duracao
from TarefasXPausas
[ ]´s,
Lukas Baldan- Marcado como Resposta Cleber West segunda-feira, 27 de agosto de 2012 12:59
Todas as Respostas
-
Cleber,
não dá pra usar o alias como você gostaria. Segue um exemplo de como poderá fazer. Quando a duração estiver preenchida, pegamos ela mesma. Quando não estiver, fazemos um DateDiff entre a data de início e GetDate.
Create Table #Tabela (id int, Id_Tarefa int, DataInicio DateTime, DataTermino DateTime, Duracao int) Insert Into #Tabela Values (10825, 139546, '2011-03-01 19:51:00.000', '2011-03-02 16:11:00.000', 491), (10826, 139822, '2011-03-03 11:52:42.000', NULL, NULL), (10827, 139819, '2011-03-03 11:53:05.000', NULL, NULL), (10828, 139827, '2011-03-03 11:53:17.000', NULL, NULL), (10829, 139831, '2011-03-03 11:53:27.000', NULL, NULL), (10830, 139515, '2011-03-03 11:53:40.000', NULL, NULL), (10831, 139664, '2011-03-03 15:13:44.000', NULL, NULL), (10832, 139485, '2011-03-03 15:22:47.000', NULL, NULL), (10833, 139701, '2011-03-03 15:23:31.000', NULL, NULL), (10834, 140284, '2011-03-04 14:55:41.000', '2011-03-04 14:57:21.000', 2), (10835, 140064, '2011-03-04 16:17:32.000', '2011-03-04 16:20:53.000', 3) Select id, Id_Tarefa, DataInicio, Isnull(DataTermino, GETDATE()) as [ValHoje], Duracao = Case When (Duracao is not Null) Then Duracao Else DateDiff(MINUTE, DataInicio, GetDate()) End From #Tabela
Isso resolve para um simples Select, já que pelo visto você não pode atualizar estas colunas da tabela (com um Update).
Roberson Ferreira - Database Developer
Acesse: www.robersonferreira.com.br
Email: contato@robersonferreira.com.brSe esta sugestão for útil, por favor, classifique-a como útil.
Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.- Marcado como Resposta Cleber West segunda-feira, 27 de agosto de 2012 12:59
-
Olá Cleber,
tente usar o case when
ficaria mais ou menos assim
select top 11 id, Id_Tarefa, DataInicio, isnull(DataTermino, GETDATE()) as [ValHoje],
(CASE WHEN DataTermino is NOT null then Duracao else DATEDIFF(MINUTE,DataInicio,GETDATE()) END) Duracao
from TarefasXPausas
[ ]´s,
Lukas Baldan- Marcado como Resposta Cleber West segunda-feira, 27 de agosto de 2012 12:59
-