Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Restar días+conflicto con meses

Estas en el tema de Restar días+conflicto con meses en el foro de SQL Server en Foros del Web. Hola ... antes que nada tengo que aclarar que no trabajé jamás con SQL Server ... toda mi experiencia se limita a PHP MySQL ... ...
  #1 (permalink)  
Antiguo 09/11/2006, 10:40
Avatar de jpvilar  
Fecha de Ingreso: febrero-2005
Ubicación: Buenos Aires - Argentina
Mensajes: 128
Antigüedad: 19 años, 3 meses
Puntos: 1
Exclamación Restar días+conflicto con meses

Hola ... antes que nada tengo que aclarar que no trabajé jamás con SQL Server ... toda mi experiencia se limita a PHP MySQL ...

Tengo que hacer un módulo en PowerBuilder y una base SQL para calcular y mostrar los cumpleaños de usuarios del sistema 3 días atrás de hoy y 6 días adelante ... hasta allí todo bien ... el problema es en el límite del mes ... no encuentro el modo de hacerlo ... en MySQL tenés la función DATE_FORMAT que te trae la parte que quieras de la fecha en formato fecha ... o sea podés comparar fecha con fecha (mm/dd) ... pero no encuentro como hacerlo ... copoio mi código para las búsquedas del día actual y para las búsquedas de mes atrás y mes adelante ... espero me puedan dar una mano ...

Código:
// CUMPLEN AÑOS HOY

SELECT dat_invar.legajo,   
         dat_invar.fecha_nacim,   
         leg.legajo,   
         leg.apellidos,   
         leg.nombres,
			m_rubros.cod_rubro,   
         m_rubros.nom_rubro 
    FROM dat_invar,   
         leg, dat_pers  LEFT JOIN m_rubros ON dat_pers.cod_prof = m_rubros.cod_rubro
   WHERE ( leg.legajo = dat_invar.legajo ) and
			( leg.legajo = dat_pers.legajo ) 
			and  
         ( ( leg.nivel = 'P' ) OR  
         ( leg.nivel = 'D' ))
			and ( MONTH(dat_invar.fecha_nacim) = MONTH(getDate()) and
			DAY(dat_invar.fecha_nacim) = DAY(getDate())) AND  
         leg.status = 'A'
ORDER BY leg.apellidos ASC,   
         leg.nombres ASC
Código:
// MES ANTERIOR O SIGUIENTE :ret_mes es una variable
SELECT dat_invar.legajo,   
         dat_invar.fecha_nacim,   
         leg.legajo,   
         leg.apellidos,   
         leg.nombres,
			m_rubros.cod_rubro,   
         m_rubros.nom_rubro 
    FROM dat_invar,   
         leg, dat_pers  LEFT JOIN m_rubros ON dat_pers.cod_prof = m_rubros.cod_rubro
   WHERE ( leg.legajo = dat_invar.legajo ) and
			( leg.legajo = dat_pers.legajo ) 
			and  
         ( ( leg.nivel = 'P' ) OR  
         ( leg.nivel = 'D' )) AND
			(MONTH(dat_invar.fecha_nacim) = MONTH(DATEADD ( MONTH , :ret_mes, getDate() ))) AND leg.status = 'A'
ORDER BY DAY(dat_invar.fecha_nacim) ASC, leg.apellidos ASC, leg.nombres ASC
Gracias desde ya
__________________
JuanP
QUIEN NO SE EQUIVOCA NO APRENDE ...
QUIEN NO APRENDE SE EQUIVOCA ... PERO NO APRENDE
  #2 (permalink)  
Antiguo 10/11/2006, 17:38
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Creo que más o menos lo que necesitas es algo como esto:

WHERE DateAdd(Year, DateDiff(Year, Year(GetDate())-Year(dat_invar.fecha_nacim)), dat_invar.fecha_nacim)
BETWEEN DateAdd(Day, -3 GetDate()) AND DateAdd(Day, 6 GetDate())

La idea básica es que a su fecha de nacimiento le sumas la cantidad de años que han pasado entre esa fecha y hoy. El resultado de una fecha como 1979-12-24 es 2006-12-24, el resto es simplemente ver si esa fecha resultante está dentro del rango de "hoy menos 3 días" y "hoy más 6 días"

Espero te sirva
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #3 (permalink)  
Antiguo 10/11/2006, 19:40
Avatar de jpvilar  
Fecha de Ingreso: febrero-2005
Ubicación: Buenos Aires - Argentina
Mensajes: 128
Antigüedad: 19 años, 3 meses
Puntos: 1
Gracias Mithrandir ... no lo voy a poder probar hasta el lunes que vaya al trabajo ... pero por lo que veo es bastante lógico lo que me contestás ... y simple ... si te copiara las cosas que he hecho para dejar de complicarme con el año ... del tipo ...

Código:
CONVERT(DATETIME,(CONVERT (VARCHAR (5) , dat_invar.fecha_nacim,103 ) + '/2006'))
/////////////////////
convert (datetime,('2006'+convert (VARCHAR(5) ,dat_invar.fecha_nacim )),102)
////////////////////
CONVERT(DATETIME,(CAST ( datepart(DAY, dat_invar.fecha_nacim) AS varchar(2) ) + '/' + CAST ( datepart(MONTH, dat_invar.fecha_nacim) AS varchar(2))+'/00'))
para nivelar todos los años a este año ... pufff ... no andaba ... me volví loco ... lo pruebo el lunes sobre el servidor del trabajo y te cuento ... igualmente muchísimas gracias desde ya ...

Saludos
__________________
JuanP
QUIEN NO SE EQUIVOCA NO APRENDE ...
QUIEN NO APRENDE SE EQUIVOCA ... PERO NO APRENDE
  #4 (permalink)  
Antiguo 13/11/2006, 08:42
Avatar de jpvilar  
Fecha de Ingreso: febrero-2005
Ubicación: Buenos Aires - Argentina
Mensajes: 128
Antigüedad: 19 años, 3 meses
Puntos: 1
De acuerdo

Bueno Mithrandir, ya te puedo confirmar que funciona ... muchísimas gracias ... hubo que hacerle un par de retoques y alguna corrección de sintaxis ... lógica de código escrito on the fly ... pero funciona perfecto ...

Te copio el código para que quede y que veas como quedó ...

Código:
WHERE DateAdd(Year, DateDiff(Year, dat_invar.fecha_nacim,GetDate()), dat_invar.fecha_nacim) BETWEEN DateAdd(Day, -3, GetDate()) AND DateAdd(Day, 6, GetDate())
Gracias de nuevo ...
__________________
JuanP
QUIEN NO SE EQUIVOCA NO APRENDE ...
QUIEN NO APRENDE SE EQUIVOCA ... PERO NO APRENDE
  #5 (permalink)  
Antiguo 14/11/2006, 16:51
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Me alegro que haya funcionado

Suerte en el proyecto.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:27.