none
Calculando valores nulos em colunas com alias RRS feed

  • 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
    sexta-feira, 24 de agosto de 2012 23:09

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.br

    Se 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
    sexta-feira, 24 de agosto de 2012 23:46
    Moderador
  • 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
    sexta-feira, 24 de agosto de 2012 23:46

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.br

    Se 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
    sexta-feira, 24 de agosto de 2012 23:46
    Moderador
  • 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
    sexta-feira, 24 de agosto de 2012 23:46
  • Olá Roberson e Lukas,

    Em ambos os casos obtive sucesso, as 2 queries resolvem o problema. Tinha pensado em utilizar o IF/ELSE mas não havia conseguido implementação. Obrigado pelo auxilio.

    segunda-feira, 27 de agosto de 2012 13:02