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.