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.


