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.