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.
 
 


