locked
Obtener el numero de dias en SQL

    Pregunta

  • Espero me puedan ayudar, quiero saber de una funcion en SQL Server que me calcule el numero de dias de un mes determinado, o el ultimo dia del mes
    viernes, 13 de julio de 2007 18:38

Respuestas

  • A partir de una fecha cualquiera, puedes sumarle un mes (dateadd) para llegar al mismo dia del mes siguiente, luego reasignarla al primer dia de ese mes, y finalmente restarle un día para llegar al ultimo dia del mes de la fecha original.

     

    Aqui tienes el ejemplo de codigo Transact-SQL para hacerlo paso a paso:

     

    Code Snippet

    declare @fecha1 datetime
     declare @fecha2 datetime
     declare @str varchar(10)

    set @fecha1 = getdate()
     set @str = convert(varchar(8),dateadd(month,1, @fecha1),112)
     set @fecha2 = dateadd(day,-1,left(@str,6)+'01')

    select @fecha1,@fecha2,day(@fecha2)

     

     

    y si lo quieres todo en un solo paso, seria así:

     

    Code Snippet

    declare @fecha1 datetime
     set @fecha1 = getdate()

    select dateadd(day,-1,left(convert(varchar(8),dateadd(month,1,@fecha1),112),6)+'01')

     

     

    Saludos,

    Jose

    ----

    MCP, Tercer Planeta (Buenos Aires) http://www.buenaspracticas.net

       Colabora con el foro: Si la respuesta te es de utilidad marca la pregunta como respondida.

    viernes, 13 de julio de 2007 18:58
  • Esta función te retornará la cantidad de días en el mes correspondiente a la fecha que especifiques:

     

    Code Snippet

    CREATE FUNCTION [dbo].[DiasEnMes] ( @fecha DATETIME )

    RETURNS INT

    AS

    BEGIN

     

        SET @fecha = CONVERT(VARCHAR(10), @fecha, 101)

        SET @fecha = @fecha - DAY(@fecha) + 1

     

        RETURN DATEDIFF(DD, @fecha, DATEADD(MM, 1, @fecha))

    END

    GO

     

    Para saber cuántos días tuvo Marzo del 2007, por ejemplo, invocarías a la función de esta forma:

    Code Snippet

    SELECT dbo.DiasEnMes('2007-03-01')

     

    Saludos,

     

    Julio

    sábado, 21 de julio de 2007 23:16
  • Con este codigo obtienes el numero de dias del mes de una fecha determinada.

    declare @fecha datetime
    set @fecha = '01/01/2008'

    select DATEDIFF(dd, @fecha, DATEADD(mm, 1, @fecha))

    Con esta linea el numero de dias del mes en curso

    select DATEDIFF(dd, current_timestamp, DATEADD(mm, 1, current_timestamp))
    Saludos
    viernes, 03 de octubre de 2008 17:16

Todas las respuestas

  • A partir de una fecha cualquiera, puedes sumarle un mes (dateadd) para llegar al mismo dia del mes siguiente, luego reasignarla al primer dia de ese mes, y finalmente restarle un día para llegar al ultimo dia del mes de la fecha original.

     

    Aqui tienes el ejemplo de codigo Transact-SQL para hacerlo paso a paso:

     

    Code Snippet

    declare @fecha1 datetime
     declare @fecha2 datetime
     declare @str varchar(10)

    set @fecha1 = getdate()
     set @str = convert(varchar(8),dateadd(month,1, @fecha1),112)
     set @fecha2 = dateadd(day,-1,left(@str,6)+'01')

    select @fecha1,@fecha2,day(@fecha2)

     

     

    y si lo quieres todo en un solo paso, seria así:

     

    Code Snippet

    declare @fecha1 datetime
     set @fecha1 = getdate()

    select dateadd(day,-1,left(convert(varchar(8),dateadd(month,1,@fecha1),112),6)+'01')

     

     

    Saludos,

    Jose

    ----

    MCP, Tercer Planeta (Buenos Aires) http://www.buenaspracticas.net

       Colabora con el foro: Si la respuesta te es de utilidad marca la pregunta como respondida.

    viernes, 13 de julio de 2007 18:58
  • Esta función te retornará la cantidad de días en el mes correspondiente a la fecha que especifiques:

     

    Code Snippet

    CREATE FUNCTION [dbo].[DiasEnMes] ( @fecha DATETIME )

    RETURNS INT

    AS

    BEGIN

     

        SET @fecha = CONVERT(VARCHAR(10), @fecha, 101)

        SET @fecha = @fecha - DAY(@fecha) + 1

     

        RETURN DATEDIFF(DD, @fecha, DATEADD(MM, 1, @fecha))

    END

    GO

     

    Para saber cuántos días tuvo Marzo del 2007, por ejemplo, invocarías a la función de esta forma:

    Code Snippet

    SELECT dbo.DiasEnMes('2007-03-01')

     

    Saludos,

     

    Julio

    sábado, 21 de julio de 2007 23:16
  • Con este codigo obtienes el numero de dias del mes de una fecha determinada.

    declare @fecha datetime
    set @fecha = '01/01/2008'

    select DATEDIFF(dd, @fecha, DATEADD(mm, 1, @fecha))

    Con esta linea el numero de dias del mes en curso

    select DATEDIFF(dd, current_timestamp, DATEADD(mm, 1, current_timestamp))
    Saludos
    viernes, 03 de octubre de 2008 17:16
  • declare

     

    @anotraini varchar(6), @anotrafin varchar(6)

    select

     

    @anotraini = '200901', @anotrafin = '200912'

    drop

     

    table #diasmes

    create

     

    table #diasmes (anotra varchar(6), Dias varchar(2))

    declare

     

    @anotra varchar(6)

    select

     

    @anotra = substring(@anotraini,1,4)--carga @anotra con el ao inicial

    WHILE

     

    @anotra <= substring(@anotrafin,1,4)--valida @anotra hasta el ao final incluido

     

    BEGIN

     

    declare @mes varchar(2)

     

    select @mes = 1 --carga @mes con el mes 1

     

    WHILE @mes <= 12 --valida @mes hasta el 12 incluido

     

    BEGIN

     

    insert into #diasmes--Inserta el select que sigue..

     

    --/*

     

    select

     

    --Calcula el ultimo dia de cada mes de cada ao y arma la fecha completa de 6 caracteres y lo guarda como anotra en la tabla #diasmes

     

    convert(char(6),

     

    (dateadd(day,-1,left(convert(varchar(8),dateadd(month,1,

     

    (select @anotra + case when len(@mes)= 1 then '0'+ @mes + '01' else @mes + '01' end)),112),6)+'01')),112),

     

    --Calcula el ultimo dia de cada mes de cada ao y lo guarda como Dias del mes en la tabla #diasmes

     

    substring(convert(char(8),

     

    (dateadd(day,-1,left(convert(varchar(8),dateadd(month,1,

     

    (select @anotra + case when len(@mes)= 1 then '0'+ @mes + '01' else @mes + '01' end)),112),6)+'01')),112),7,2)

     

    --Solo inserta los meses que estan dentro del rango solicitado

     

    where (select @anotra + case when len(@mes)= 1 then '0'+ @mes else @mes end) between

    @anotraini

    and @anotrafin

     

    select @mes = @mes + 1 --Incrementa @mes en 1

     

    END

     

    select @anotra = @anotra + 1 --Incrementa @anotra en 1

     

    END

    select

     

    * from #diasmes

    jueves, 24 de septiembre de 2009 12:19