none
Calcular o número de dias entre datas RRS feed

  • Pergunta

  • Como poderia fazer um select que calcule o número de dias entre duas datas de registros?

    Por exemplo:

    ID      DATA                           INTERVALO
    1-----20 de mar de 2015---- 0
    2-----30 de mar de 2015----10
    3-----10 de abr de 2015-----???????


    • Editado Wilson Boris sexta-feira, 15 de maio de 2015 13:10 erro
    sexta-feira, 15 de maio de 2015 13:07

Respostas

  • Boa tarde,

    Tente substituir o * que está dentro da CTE pelo nome das colunas que são utilizadas na parte final da query.

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Wilson Boris quinta-feira, 21 de maio de 2015 22:45
    quinta-feira, 21 de maio de 2015 20:35
  • Bom dia Wilson,

    Para isso, você pode usar a função DATEDIFF, que retorna a diferença entre as datas. Para usa-la, você primeiro usa o parâmetro do que você quer comparar (dia, mês, ano), o segundo parâmetro é a menor data e o terceiro parâmetro é a maior data.

    Abs.

    Bruno Destro


    Dicas de programação em .net, C# e SQL - http://smcode.com.br/blog.aspx

    • Marcado como Resposta Wilson Boris sexta-feira, 15 de maio de 2015 13:46
    sexta-feira, 15 de maio de 2015 13:25
  • Wilson, seguem 2 sugestões para teste:

    select
        t.ID,
        t.Data,
        DATEDIFF
            (DAY, 
             (select top 1 a.Data from Tabela as a where a.Data < t.Data order by a.Data desc),
             t.Data) as Intervalo
    from Tabela as t

    with CTE_RN as
    (
        select
            *,
            ROW_NUMBER() OVER(ORDER BY Data) as RN
        from Tabela
    )
    
    select
         t.ID,
         t.Data,
         DATEDIFF(DAY, a.Data, t.Data) as Intervalo
    from CTE_RN as t
    left join CTE_RN as a
        on a.RN = t.RN - 1

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    100% o segundo exemplo. Obrigado.

    • Marcado como Resposta Wilson Boris sexta-feira, 15 de maio de 2015 13:46
    sexta-feira, 15 de maio de 2015 13:46
  • Boa noite !

    Veja a possibilidade de utilizer a função https://msdn.microsoft.com/pt-br/library/ms184325.aspx

    Se for para calcular o número de dias de um periodo grande, não se esqueça de se atentar para ver se os anos bissextos não estao afetando o resultado.

    Att,

    Marco

    • Marcado como Resposta Wilson Boris domingo, 17 de maio de 2015 13:50
    domingo, 17 de maio de 2015 01:48
  • Obrigado pelo retorno,

    Seria o código abaixo? Se for rodou blz...100%

    DECLARE @cod_An as int
    with CTE_RN as
    (
        select
            E.data,E.id , 
            ROW_NUMBER() OVER(ORDER BY E.data) as RN
        from Prog B, Dia E
        where E.cod_anima=@cod_An and
              B.cod_Dia = E.id   
    )
    select
         t.ID,
         t.data,
          ISNULL( DATEDIFF(DAY, a.data, t.data), 0.00) AS Intervalo     
    from CTE_RN as t
    left join CTE_RN as a
        on a.RN = t.RN - 1 

    • Marcado como Resposta Wilson Boris quinta-feira, 21 de maio de 2015 22:45
    quinta-feira, 21 de maio de 2015 22:45

Todas as Respostas

  • Bom dia,

    Wilson, qual versão do SQL Server você está utilizando?


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 15 de maio de 2015 13:11
  • 2008.
    sexta-feira, 15 de maio de 2015 13:12
  • Microsoft SQL Server Management Studio 10.50.1600.1
    Microsoft Analysis Services Client Tools 10.50.1600.1
    Microsoft Data Access Components (MDAC) 6.1.7601.17514
    Microsoft MSXML 3.0 4.0 6.0 
    Microsoft Internet Explorer 9.11.9600.17728
    Microsoft .NET Framework 2.0.50727.5485
    Operating System 6.1.7601
    sexta-feira, 15 de maio de 2015 13:13
  • declare @dataini datetime = '20150105';
    declare @datafim datetime = '20150116';

     select @dataini, @datafim , datediff(day, @dataini, @datafim) as dias;


    sexta-feira, 15 de maio de 2015 13:13
  • Wilson, seguem 2 sugestões para teste:

    select
        t.ID,
        t.Data,
        DATEDIFF
            (DAY, 
             (select top 1 a.Data from Tabela as a where a.Data < t.Data order by a.Data desc),
             t.Data) as Intervalo
    from Tabela as t

    with CTE_RN as
    (
        select
            *,
            ROW_NUMBER() OVER(ORDER BY Data) as RN
        from Tabela
    )
    
    select
         t.ID,
         t.Data,
         DATEDIFF(DAY, a.Data, t.Data) as Intervalo
    from CTE_RN as t
    left join CTE_RN as a
        on a.RN = t.RN - 1

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 15 de maio de 2015 13:21
  • Bom dia Wilson,

    Para isso, você pode usar a função DATEDIFF, que retorna a diferença entre as datas. Para usa-la, você primeiro usa o parâmetro do que você quer comparar (dia, mês, ano), o segundo parâmetro é a menor data e o terceiro parâmetro é a maior data.

    Abs.

    Bruno Destro


    Dicas de programação em .net, C# e SQL - http://smcode.com.br/blog.aspx

    • Marcado como Resposta Wilson Boris sexta-feira, 15 de maio de 2015 13:46
    sexta-feira, 15 de maio de 2015 13:25
  • Wilson, seguem 2 sugestões para teste:

    select
        t.ID,
        t.Data,
        DATEDIFF
            (DAY, 
             (select top 1 a.Data from Tabela as a where a.Data < t.Data order by a.Data desc),
             t.Data) as Intervalo
    from Tabela as t

    with CTE_RN as
    (
        select
            *,
            ROW_NUMBER() OVER(ORDER BY Data) as RN
        from Tabela
    )
    
    select
         t.ID,
         t.Data,
         DATEDIFF(DAY, a.Data, t.Data) as Intervalo
    from CTE_RN as t
    left join CTE_RN as a
        on a.RN = t.RN - 1

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    100% o segundo exemplo. Obrigado.

    • Marcado como Resposta Wilson Boris sexta-feira, 15 de maio de 2015 13:46
    sexta-feira, 15 de maio de 2015 13:46
  • Como fazer para que o retorno do primeiro registro da coluna intervalo seja zero do código abaixo, ao invés de NULL?

    id      data                 intervalo

    26 2014-06-20 .......NULL
    27 2014-08-12 .......53
    3 2014-09-02 .........21
    4 2014-09-17 .........15

     
    with CTE_RN as
    (
        select
            *,
            ROW_NUMBER() OVER(ORDER BY Data) as RN
        from Tabela
    )
    
    select
         t.ID,
         t.Data,
         DATEDIFF(DAY, a.Data, t.Data) as Intervalo
    from CTE_RN as t
    left join CTE_RN as a
        on a.RN = t.RN - 1

    • Editado Wilson Boris sábado, 16 de maio de 2015 21:47 erro
    sábado, 16 de maio de 2015 21:45
  • Boa noite !

    Veja a possibilidade de utilizer a função https://msdn.microsoft.com/pt-br/library/ms184325.aspx

    Se for para calcular o número de dias de um periodo grande, não se esqueça de se atentar para ver se os anos bissextos não estao afetando o resultado.

    Att,

    Marco

    • Marcado como Resposta Wilson Boris domingo, 17 de maio de 2015 13:50
    domingo, 17 de maio de 2015 01:48
  • Eu precisei incluir uma tabela, porém retorna com erro " The column 'id' was specified multiple times for 'CTE_RN',

    teria alguma sugestão?

    DECLARE @cod_An as int
    with CTE_RN as
    (
        select
            *,
            ROW_NUMBER() OVER(ORDER BY E.data) as RN
        from Prog B, Dia E
        where E.cod_anima=@cod_An and
              B.cod_Dia = E.id   
    )
    select
         t.ID,
         t.data,
          ISNULL( DATEDIFF(DAY, a.data, t.data), 0.00) AS Intervalo     
    from CTE_RN as t
    left join CTE_RN as a
        on a.RN = t.RN - 1


    • Editado Wilson Boris quinta-feira, 21 de maio de 2015 22:35 erro
    quinta-feira, 21 de maio de 2015 17:23
  • Boa tarde,

    Tente substituir o * que está dentro da CTE pelo nome das colunas que são utilizadas na parte final da query.

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Wilson Boris quinta-feira, 21 de maio de 2015 22:45
    quinta-feira, 21 de maio de 2015 20:35
  • Obrigado pelo retorno,

    Seria o código abaixo? Se for rodou blz...100%

    DECLARE @cod_An as int
    with CTE_RN as
    (
        select
            E.data,E.id , 
            ROW_NUMBER() OVER(ORDER BY E.data) as RN
        from Prog B, Dia E
        where E.cod_anima=@cod_An and
              B.cod_Dia = E.id   
    )
    select
         t.ID,
         t.data,
          ISNULL( DATEDIFF(DAY, a.data, t.data), 0.00) AS Intervalo     
    from CTE_RN as t
    left join CTE_RN as a
        on a.RN = t.RN - 1 

    • Marcado como Resposta Wilson Boris quinta-feira, 21 de maio de 2015 22:45
    quinta-feira, 21 de maio de 2015 22:45