none
Calcular fecha en sql server 2008

    Question

  • Hola buenas tardes, mi duda es la siguien, tengo una fecha en una tabla X lo que quiero hacer es como seccionar esa fecha de manera quincenal, osea que si tengo la fecha 25/05/2012, me la seccione a 31/05/2012, 15/06/2012 y 30/06/2012, respetando en cada mes los dias 31 y 30. Lo que estoy tratando de hacer es una aplicacion que me registre a alumnos de una escuela y a esos alumnos se les difieron el pago de inscripcion en 3 pagos, entonces la fecha la necesito para que esos tres pagos se hagan quincenalmente, espero y me ayuden. gracias.

    Thursday, June 14, 2012 4:03 PM

Answers

  • Prueba esto:

    select fecha,
    case when DAY(fecha)<15 then DATEADD(DAY,15-DAY(fecha),fecha)
    else DATEADD(DAY,-DAY(fecha),(DATEADD(MONTH,1,fecha))) END as Pago1,
    case when DAY(fecha)<15 then DATEADD(day,-DAY(fecha),(DATEADD(MONTH,1,fecha)))
    else  DATEADD(MONTH,1,DATEADD(DAY,15-DAY(fecha),fecha)) END as Pago2,
    case when DAY(fecha)<15 then DATEADD(MONTH,1,DATEADD(DAY,15-DAY(fecha),fecha))
    else DATEADD(DAY,-DAY(fecha),(DATEADD(MONTH,2,fecha)))  END as Pago3
    from X

    Puedes mejorar esto creando variables y re-usandolas en la consulta. Si usas la ultima version de SQL Server, tambien puedes usar la funcion EOMONTH en lugar de algunos calculos que aqui estan hechos a mano.

    Saludos,

    Monica

    Thursday, June 14, 2012 5:30 PM
  • Una tabla calendario te seria muy util en este caso.

    select 
        A.*
        P.fecha_pago,
        row_number() over(partition by alumno_id order by P.fecha_pago) as pago_nro
    from
        alumno as A
        cross apply
        (
        select top (3)
            C.fecha
        from
            calendar as C
        where
            C.fecha > A.fecha
            and (fecha_es_fin_de_mes = 1 or fecha_dia = 15)
        order by C.fecha
        ) as P(fecha_pago);

    Why should I consider using an auxiliary calendar table?
    http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

    Create a Time Dimension by Generating a Time Table
    http://msdn.microsoft.com/en-us/library/ms174832.aspx

     Tambien puedes incluir logica para saltar fines de semanas y/o feriados.


    AMB

    Some guidelines for posting questions...

    Thursday, June 14, 2012 5:43 PM
  • Proba eso:

    Declare	@Fecha DateTime;
    Set		@Fecha='20120525';
    Select	@Fecha [Fecha],
    		DateAdd(Month,DateDiff(Month,0,@Fecha)+1,0)-1 [Fin del mes en curso],
    		DateAdd(Month,DateDiff(Month,0,@Fecha)+1,0)+14 [Medio del mes siguiente],
    		DateAdd(Month,DateDiff(Month,0,@Fecha)+2,0)-1 [Fin del mes siguiente];


    Blog: http://about.me/GeriReshef

    Thursday, June 14, 2012 9:32 PM

All replies

  • Prueba esto:

    select fecha,
    case when DAY(fecha)<15 then DATEADD(DAY,15-DAY(fecha),fecha)
    else DATEADD(DAY,-DAY(fecha),(DATEADD(MONTH,1,fecha))) END as Pago1,
    case when DAY(fecha)<15 then DATEADD(day,-DAY(fecha),(DATEADD(MONTH,1,fecha)))
    else  DATEADD(MONTH,1,DATEADD(DAY,15-DAY(fecha),fecha)) END as Pago2,
    case when DAY(fecha)<15 then DATEADD(MONTH,1,DATEADD(DAY,15-DAY(fecha),fecha))
    else DATEADD(DAY,-DAY(fecha),(DATEADD(MONTH,2,fecha)))  END as Pago3
    from X

    Puedes mejorar esto creando variables y re-usandolas en la consulta. Si usas la ultima version de SQL Server, tambien puedes usar la funcion EOMONTH en lugar de algunos calculos que aqui estan hechos a mano.

    Saludos,

    Monica

    Thursday, June 14, 2012 5:30 PM
  • Una tabla calendario te seria muy util en este caso.

    select 
        A.*
        P.fecha_pago,
        row_number() over(partition by alumno_id order by P.fecha_pago) as pago_nro
    from
        alumno as A
        cross apply
        (
        select top (3)
            C.fecha
        from
            calendar as C
        where
            C.fecha > A.fecha
            and (fecha_es_fin_de_mes = 1 or fecha_dia = 15)
        order by C.fecha
        ) as P(fecha_pago);

    Why should I consider using an auxiliary calendar table?
    http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

    Create a Time Dimension by Generating a Time Table
    http://msdn.microsoft.com/en-us/library/ms174832.aspx

     Tambien puedes incluir logica para saltar fines de semanas y/o feriados.


    AMB

    Some guidelines for posting questions...

    Thursday, June 14, 2012 5:43 PM
  • Proba eso:

    Declare	@Fecha DateTime;
    Set		@Fecha='20120525';
    Select	@Fecha [Fecha],
    		DateAdd(Month,DateDiff(Month,0,@Fecha)+1,0)-1 [Fin del mes en curso],
    		DateAdd(Month,DateDiff(Month,0,@Fecha)+1,0)+14 [Medio del mes siguiente],
    		DateAdd(Month,DateDiff(Month,0,@Fecha)+2,0)-1 [Fin del mes siguiente];


    Blog: http://about.me/GeriReshef

    Thursday, June 14, 2012 9:32 PM
  • muchas gracias a todos, estoy empezando a usar fechas en sql y se me complica mucho, pero sus ejemplos me ayudaron mucho, en cuanto termine les comparto lo que hise, muchas gracias.
    Tuesday, June 19, 2012 3:40 PM
  • Adcional a toda la información te dejo un link que te explica las mejores practicas para el manejo de fechas en sql server,

    con el que te podrias ahorrar algunos topes contra la pared en un futuro,,

    http://dbasqlserver.wordpress.com/2012/05/03/mejores-practicas-para-manejo-de-fechas-en-sqlserver/

    Saludos

    Tuesday, June 19, 2012 6:15 PM