none
Diferencas entre datas no datagrid RRS feed

  • Pergunta

  • Bom dia !

    E possivel mostrar diferencas entre duas data no datagridview sem tem que usar o datediff na instrucao SQL ?

    Tenho 2 datas no Datagrid (Inicial e FIm) e gostaria de mostar a diferencas entre elas em horas.

    Obrigado!

    sábado, 7 de dezembro de 2013 12:54

Respostas

  • Depois de muito pesquisar encontrei a solução,

    Fiz usando o proprio Datediff, porem percebi que somente dava erro quando em alguns caso nao tinha a data final ainda, entao fiz uma IIF  que quando nao tivesse a data final eu usaria o date() e deu certo !

    IFF(DateDiff('n',[Data_Inicio],[Data_Fim]) Is Null,DateDiff('n',[Data_Inicio],[Date()]),DateDiff('n',[Data_Inicio],[Data_Fim]))AS Minutos

    Obrigado a todos

    • Marcado como Resposta RJ_Silva quarta-feira, 18 de dezembro de 2013 22:22
    quarta-feira, 18 de dezembro de 2013 22:22

Todas as Respostas

  • Não sei se vai te ajudar, mas eu fiz uma coisa parecida, no sql

    --DROP TABLE TB_TOTAIS
    CREATE TABLE TB_TOTAIS
    (
    datainicial datetime
    ,datafinal datetime
    ,diferenca AS CONVERT(VARCHAR, datafinal - datainicial, 108)
    ,datadiferenca AS  datafinal - datainicial
    )

    INSERT INTO TB_TOTAIS (datainicial, datafinal) VALUES ('2013-12-08 12:44:00', '2013-12-09 09:12:00')
    INSERT INTO TB_TOTAIS (datainicial, datafinal) VALUES ('2013-12-08 18:15:00', '2013-12-09 13:40:00')
    INSERT INTO TB_TOTAIS (datainicial, datafinal) VALUES ('2013-12-08 23:11:00', '2013-12-09 13:52:00')

    SELECT * FROM TB_TOTAIS

    /*  E SE VOCE QUISER RETORNAR EM SEGUNDOS */

    SELECT * ,[Tempo_em_segundos]  = ISNULL((DATEPART(HOUR, CONVERT(DATETIME, datadiferenca)) * 3600) + 
                       (DATEPART(MINUTE, CONVERT(DATETIME, datadiferenca)) * 60) + DATEPART(SECOND, CONVERT(DATETIME, datadiferenca)), 0) 

    FROM TB_TOTAIS


    o retorno do tempo em segundos é interessante se vc quiser somar o tempo total no seu grid.
    Para mostrar o tempo_em_segundos na tela eu usei o string format abaixo: (converte tempo em segundos em hora minuto e segundo)

    String.Format("{0}:{1}:{2}", ((segundos / 60) / 60).ToString().PadLeft(2, '0'),
                                        ((segundos / 60) % 60).ToString().PadLeft(2, '0'), (segundos % 60).ToString().PadLeft(2, '0'));

    Espero que te ajude de alguma forma

    segunda-feira, 9 de dezembro de 2013 17:08
  • Não sei se vai te ajudar, mas eu fiz uma coisa parecida, no sql

    --DROP TABLE TB_TOTAIS
    CREATE TABLE TB_TOTAIS
    (
    datainicial datetime
    ,datafinal datetime
    ,diferenca AS CONVERT(VARCHAR, datafinal - datainicial, 108)
    ,datadiferenca AS  datafinal - datainicial
    )

    INSERT INTO TB_TOTAIS (datainicial, datafinal) VALUES ('2013-12-08 12:44:00', '2013-12-09 09:12:00')
    INSERT INTO TB_TOTAIS (datainicial, datafinal) VALUES ('2013-12-08 18:15:00', '2013-12-09 13:40:00')
    INSERT INTO TB_TOTAIS (datainicial, datafinal) VALUES ('2013-12-08 23:11:00', '2013-12-09 13:52:00')

    SELECT * FROM TB_TOTAIS

    /*  E SE VOCE QUISER RETORNAR EM SEGUNDOS */

    SELECT * ,[Tempo_em_segundos]  = ISNULL((DATEPART(HOUR, CONVERT(DATETIME, datadiferenca)) * 3600) + 
                       (DATEPART(MINUTE, CONVERT(DATETIME, datadiferenca)) * 60) + DATEPART(SECOND, CONVERT(DATETIME, datadiferenca)), 0) 

    FROM TB_TOTAIS


    o retorno do tempo em segundos é interessante se vc quiser somar o tempo total no seu grid.
    Para mostrar o tempo_em_segundos na tela eu usei o string format abaixo: (converte tempo em segundos em hora minuto e segundo)

    String.Format("{0}:{1}:{2}", ((segundos / 60) / 60).ToString().PadLeft(2, '0'),
                                        ((segundos / 60) % 60).ToString().PadLeft(2, '0'), (segundos % 60).ToString().PadLeft(2, '0'));

    Espero que te ajude de alguma forma

    Jose Geraldo, Obrigado por responder,

    No Sql eu consigo fazer tbm (Fiz um pouco difrente), mas achei que de alguma forma o datagrid tivesse uma funcao ou algo parecido pra mostar a diferenca entre datas

    Sabe se tem como fazer direto no grid ? 

    terça-feira, 10 de dezembro de 2013 22:15
  • Cara,

    O não é o datagrid que controla esse tipo de informação que deseja, primeiro você trata a informação de acordo com sua necessidade, para depois simplesmente mostrar no datagrid.

    Tente utilizar o seguinte método:

    DateTime.Subtract

    http://msdn.microsoft.com/pt-br/library/8ysw4sby(v=vs.110).aspx


    Atenciosamente, Samuel dos Anjos

    quarta-feira, 11 de dezembro de 2013 01:31
  • Olá RJ_Silva,

    Conseguiu resolver? poste aqui o resultado.


    Isaias S. Silva

    quarta-feira, 11 de dezembro de 2013 11:32
  • Cara,

    O não é o datagrid que controla esse tipo de informação que deseja, primeiro você trata a informação de acordo com sua necessidade, para depois simplesmente mostrar no datagrid.

    Tente utilizar o seguinte método:

    DateTime.Subtract

    http://msdn.microsoft.com/pt-br/library/8ysw4sby(v=vs.110).aspx


    Atenciosamente, Samuel dos Anjos

    Samuel, sei que o mais correto seria usar um datediff na Intrunção SQL e simplesmente mostrar no Grid,

    Mas estou tendo um problema em fazer isso e nao estou conseguindo entender e por isso parti pra essa alternativa de mostrar as diferença entre duas data do grid.

    Mas A ideia é o seguinte tenho um grid e uma coluna é INICIAL e outra FINAL gostaria de mostrar em uma terceira coluna a diferença em horas (hh:nn).

    Em um outro forma uso EXATAMENTE o mesmo codigo e funciona,e nesse formulario esta dando erro.

    Segue o codigo e a imagem do erro 

               

        DtEventos = db.ExecutarSelect("SELECT Format(Tbl_Acompanhamento.Aco_Dt_Inicio,'dd/mm/yyyy hh:nn') AS Data_Inicio,"
                + " Format(Tbl_Acompanhamento.Aco_Dt_Fim,'dd/mm/yyyy hh:nn') as Data_Fim, DateDiff('n',[Data_Inicio],[Data_Fim]) AS Minutos,"
                + " Format(Int([Minutos]/60),'00') & ':' & Format([Minutos]-(Int([Minutos]/60)*60),'00') AS Tempo, Tbl_Acompanhamento.Eve_Nome AS Evento,"
                + " Tbl_Acompanhamento.Man_ID AS Man_ID, Tbl_Acompanhamento.ID_Acomp FROM Tbl_Acompanhamento WORDER BY Tbl_Acompanhamento.ID_Acomp DESC");

    onde DtEventos meu datatable.

    Ja tentei tbm fazer uma teste usando somente o datasource do proprio grid(Grid.Datasource =db.executarselect("Select...")) e da o mesmo erro. Ja deletei o grid e inseir um novo e nada.

    quarta-feira, 11 de dezembro de 2013 21:39
  • Cara,

    O não é o datagrid que controla esse tipo de informação que deseja, primeiro você trata a informação de acordo com sua necessidade, para depois simplesmente mostrar no datagrid.

    Tente utilizar o seguinte método:

    DateTime.Subtract

    http://msdn.microsoft.com/pt-br/library/8ysw4sby(v=vs.110).aspx


    Atenciosamente, Samuel dos Anjos

    Samuel, sei que o mais correto seria usar um datediff na Intrunção SQL e simplesmente mostrar no Grid,

    Mas estou tendo um problema em fazer isso e nao estou conseguindo entender e por isso parti pra essa alternativa de mostrar as diferença entre duas data do grid.

    Mas A ideia é o seguinte tenho um grid e uma coluna é INICIAL e outra FINAL gostaria de mostrar em uma terceira coluna a diferença em horas (hh:nn).

    Em um outro forma uso EXATAMENTE o mesmo codigo e funciona,e nesse formulario esta dando erro.

    Segue o codigo e a imagem do erro 

               

        DtEventos = db.ExecutarSelect("SELECT Format(Tbl_Acompanhamento.Aco_Dt_Inicio,'dd/mm/yyyy hh:nn') AS Data_Inicio,"
                + " Format(Tbl_Acompanhamento.Aco_Dt_Fim,'dd/mm/yyyy hh:nn') as Data_Fim, DateDiff('n',[Data_Inicio],[Data_Fim]) AS Minutos,"
                + " Format(Int([Minutos]/60),'00') & ':' & Format([Minutos]-(Int([Minutos]/60)*60),'00') AS Tempo, Tbl_Acompanhamento.Eve_Nome AS Evento,"
                + " Tbl_Acompanhamento.Man_ID AS Man_ID, Tbl_Acompanhamento.ID_Acomp FROM Tbl_Acompanhamento WORDER BY Tbl_Acompanhamento.ID_Acomp DESC");

    onde DtEventos meu datatable.

    Ja tentei tbm fazer uma teste usando somente o datasource do proprio grid(Grid.Datasource =db.executarselect("Select...")) e da o mesmo erro. Ja deletei o grid e inseir um novo e nada.

    Obs.:quando executo a sentenca SQL no banco funciona, e quando testo por parte nesse formualrio so da erro quando coloco o datediff  DateDiff('n',[Data_Inicio],[Data_Fim]) AS Minutos
    quarta-feira, 11 de dezembro de 2013 21:41
  • Olá RJ_Silva,

    Conseguiu resolver? poste aqui o resultado.


    Isaias S. Silva

    Ainda nao resolvi.
    quarta-feira, 11 de dezembro de 2013 21:41
  • Cara,

    Tente utilizar o OleDbDataAdapter.Fill:

                    using (SqlConnection cConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ToString()))
                    {
                        cConnection.Open();
    
                        using (SqlCommand cCommand = new SqlCommand())
                        {
                            cCommand.Connection = cConnection;
                            cCommand.CommandType = CommandType.Text;
    
                            cCommand.CommandText = "SELECT * FROM TESTE";
    
                            DataTable dtRetorno = new DataTable();
    
                            using (SqlDataAdapter sqlAdapter = new SqlDataAdapter(cCommand))
                            {
                                sqlAdapter.Fill(dtRetorno);
                            }
    
                            return dtRetorno;         
                        }
                    }

    http://msdn.microsoft.com/pt-br/library/system.data.oledb.oledbdataadapter(v=vs.110).aspx

    http://msdn.microsoft.com/pt-br/library/905keexk(v=vs.110).aspx

    Obs.

    No meu caso eu utilizei o SqlDataAdapter, porém os procedimentos são os mesmos para o OleDbDataAdapter.



    Atenciosamente, Samuel dos Anjos

    quinta-feira, 12 de dezembro de 2013 21:43
  • Cara,

    Tente utilizar o OleDbDataAdapter.Fill:

                    using (SqlConnection cConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ToString()))
                    {
                        cConnection.Open();
    
                        using (SqlCommand cCommand = new SqlCommand())
                        {
                            cCommand.Connection = cConnection;
                            cCommand.CommandType = CommandType.Text;
    
                            cCommand.CommandText = "SELECT * FROM TESTE";
    
                            DataTable dtRetorno = new DataTable();
    
                            using (SqlDataAdapter sqlAdapter = new SqlDataAdapter(cCommand))
                            {
                                sqlAdapter.Fill(dtRetorno);
                            }
    
                            return dtRetorno;         
                        }
                    }

    http://msdn.microsoft.com/pt-br/library/system.data.oledb.oledbdataadapter(v=vs.110).aspx

    http://msdn.microsoft.com/pt-br/library/905keexk(v=vs.110).aspx

    Obs.

    No meu caso eu utilizei o SqlDataAdapter, porém os procedimentos são os mesmos para o OleDbDataAdapter.



    Atenciosamente, Samuel dos Anjos

    Samuel, Ja havia testado com dataadpater antes e deu exatamente o mesmo erro.
    quinta-feira, 12 de dezembro de 2013 22:32
  • UP! Alguma sugestao ?
    domingo, 15 de dezembro de 2013 17:44
  • Depois de muito pesquisar encontrei a solução,

    Fiz usando o proprio Datediff, porem percebi que somente dava erro quando em alguns caso nao tinha a data final ainda, entao fiz uma IIF  que quando nao tivesse a data final eu usaria o date() e deu certo !

    IFF(DateDiff('n',[Data_Inicio],[Data_Fim]) Is Null,DateDiff('n',[Data_Inicio],[Date()]),DateDiff('n',[Data_Inicio],[Data_Fim]))AS Minutos

    Obrigado a todos

    • Marcado como Resposta RJ_Silva quarta-feira, 18 de dezembro de 2013 22:22
    quarta-feira, 18 de dezembro de 2013 22:22