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

Duda en procedimiento almacenado con fechas de festivos

Estas en el tema de Duda en procedimiento almacenado con fechas de festivos en el foro de SQL Server en Foros del Web. Hola foreros. Me encuentro realizando un procedimiento almacenado que envía mails de felicitación de cumpleaños, el procedimiento se ejecuta una vez al día. El email ...
  #1 (permalink)  
Antiguo 12/01/2012, 15:27
 
Fecha de Ingreso: abril-2010
Mensajes: 50
Antigüedad: 14 años
Puntos: 2
Duda en procedimiento almacenado con fechas de festivos

Hola foreros. Me encuentro realizando un procedimiento almacenado que envía mails de felicitación de cumpleaños, el procedimiento se ejecuta una vez al día. El email se envía un día antes de que la persona cumpla años, a su vez si fuera ese día festivo o sábado o domingo, el mail se tendría que enviar antes. El cálculo de los días festivos está en una tabla, en el caso de los sábados y domingos, utilizo algo parecido a esto: SELECT DATEPART(dw, getdate()), que me determina el número del día de la semana y si es 6 o 7 no se enviaría.

Mi problema es que si el envío del mail se tiene que producir el envío antes de la fecha y con la condición de que no sea festivo o sábado y domingo. Me estoy liando en la cuestión de restar fechas, es decir, imaginad que el jueves y el viernes es fiesta, el mail de felicitación se tendría que enviar el miércoles a pesar de que Pepito cumpla años el domingo. Mi problema reside a la hora de comparar fechas, la idea de restar un día a la fecha de cumpleaños y mirar días hacia delante para ver quien cumple años y luego enviar el correo en la fecha correcta en base a las condiciones, pues me está superando. Se me dan muy mal las fechas, aunque me las dibuje, pienso demasiado en las posibilidades incluso una vez escritas como ahora y me lío.

Os pongo el código que tengo, para situaros un poco:
Código:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[SendEmailCumple]  
AS
BEGIN
-- 1 select de la tabla SELECT  * FROM DATOS_CUMPLEANYOS
--  con los filtros de fechaultmoenvio y  fechaultmoenvio != fecha_nacimiento

-- 2 Si es festivo o sábado y domingo no se envía mail
-- 3 sacamos los cumpleaños de los empleados que cumplen años mañana
-- 4 actualizar fechade ultimo envio para no volver a enviar 2 veces el mismo correo

-- parte 1 añadir
declare @id_empleado int
declare @nombre varchar(50)
declare @Apellido1 varchar(50)
declare @fecha_nacimiento datetime
declare @Email nvarchar(50)
declare @fechaultenvio  datetime

DECLARE @resultado datetime

DECLARE puntero cursor FOR 

-- 2 Si es festivo o sábado y domingo no se envía mail
-- Si es sábado o domingo
--IF SELECT DATEPART(dw, getdate()) 
-- Días festivos
--SELECT [Dia]
--      ,[Mes]
--  FROM [INGCar].[dbo].[fabFestivosAnuales]

-- 3 cumpleaños de los empleados que cumplen años mañana
SELECT 
id_empleado
, Nombre
, Apellido1 
,fecha_nacimiento 
,Email 
,FechaUltEnvio
FROM [ICL-Repositorio].[dbo].[DATOS_CUMPLEANYOS]
where month(fecha_nacimiento)
= month(getdate())
and day(fecha_nacimiento) = CAST(CAST(day(GETDATE()) + 1 AS INT) AS DATETIME)
and FechaUltEnvio is null 

OPEN puntero

SELECT 
id_empleado
, Nombre
, Apellido1 
,fecha_nacimiento 
,Email 
,FechaUltEnvio
FROM [ICL-Repositorio].[dbo].[DATOS_CUMPLEANYOS]
where month(fecha_nacimiento)
= month(getdate())
and day(fecha_nacimiento) = CAST(CAST(day(GETDATE()) + 1 AS INT) AS DATETIME)
and FechaUltEnvio is null

    FETCH NEXT FROM puntero
    INTO @id_empleado,@Nombre,@Apellido1,@Fecha_Nacimiento,@Email,@fechaultenvio
    WHILE @@fetch_status = 0
        BEGIN

        -- Parte 2 contruir email
        declare @Contenido VARCHAR(MAX)
        declare @asunto nvarchar(50)
        
        SET @Contenido =''
        SET @Contenido = @Contenido + '<html>'
        SET @Contenido = @Contenido + '<head><title>Imagen</title>'
        SET @Contenido = @Contenido + '</head><body><div>'
        SET @Contenido = @Contenido + '<IMG SRC="https://www.oficinavirtual.alphabet.es/cumple.jpg" ALT="Alphabet">'
        SET @Contenido = @Contenido + '</div>'
        SET @Contenido = @Contenido + '</body></html>'                
        SET @Asunto= @nombre + '  pruebas email de felicitación'

        --  Parte 2.1 envio email

        EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'cobros', 
        @recipients = @email  ,
        @subject = @asunto , 
        @body = @Contenido,
        @body_format = 'HTML';

        -- parte 3 ACTUALIZAR FECHA DE ENVÍO DE EMAIL

        UPDATE DATOS_CUMPLEANYOS SET FechaUltEnvio = getdate()
        WHERE id_empleado = @id_empleado

   FETCH NEXT FROM puntero
   INTO @id_empleado,@Nombre,@Apellido1,@Fecha_Nacimiento,@Email,@fechaultenvio
   END

   close puntero
   deallocate puntero

END

Alquien me ilumina y me echa una mano? Muchísimas gracias de antemano.

Última edición por delgaillo; 14/01/2012 a las 06:36

Etiquetas: fecha, festivos, procedimiento, select, tabla, almacenar
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 00:22.