Stack Overflow en español Asked by Franco Torres on December 4, 2021
Tengo una tabla llamada Cuota
, la cual tiene una Fecha_vencimiento
(de tipo Date
) y un estado
(de tipo varchar
). Necesito que cuando llegue la fecha de vencimiento el estado cambie, de forma automática, de 'VALIDA'
a 'VENCIDA'
.
No se si tengo que hacerlo con un procedimiento almacenado o con un trigger; de ser con alguno de estos 2, ¿Cómo hago que se ejecute automáticamente llegada la fecha de vencimiento?.
Dada la descripción del problema que estás dando, te voy a responder lo que NO estás preguntando, pues este es el típico caso del problema xy.
Esto, porque si bien SQL Server tiene los mecanismos para realizar la tarea que buscas, realmente no hace falta complicar tanto las cosas si sigues el principio básico de no almacenar información derivada en las tablas.
Es decir, ya tienes la fecha de expiración y puedes averiguar en cualquier momento la fecha actual, con la función getdate()
. Una simple comparación te dirá si una cuota está expirada o no.
Mantener almacenada, en otra columna, la misma información, pero de otra forma, por ejemplo, saber si está vencida o no, es redundante y suele ser una fuente de problemas por errores en la programación y/o configuración.
Dicho esto, con SQL server tampoco es necesario que escribas la regla que te dice el status del registro en cada consulta, ya que puedes tirar de las columnas calculadas.
Por ejemplo, mira la sentencia de creación de esta tabla:
create table DatosExpiran (
id bigint not null identity primary key
, FechaExpiracion datetime not null
, compEstaExpirado as case when FechaExpiracion < getdate() then 0 else 1 end
, compEstadoActual as case when FechaExpiracion < getdate() then 'VENCIDO' else 'VIGENTE' end
);
Si insertamos estos valores:
insert into DatosExpiran (FechaExpiracion)
values ('20200101 17:12:14')
, ('20211231 11:14:12')
, (dateadd(ss, 60, getdate()));
Al ejecutar esta consulta:
select *, getdate() FechaActual
from DatosExpiran;
Obtengo, al inicio, estos valores:
id FechaExpiracion compEstaExpirado compEstadoActual FechaActual
-------------------- ----------------------- ---------------- ---------------- -----------------------
1 2020-01-01 17:12:14.000 0 VENCIDO 2020-07-23 22:13:39.583
2 2021-12-31 11:14:12.000 1 VIGENTE 2020-07-23 22:13:39.583
3 2020-07-23 22:14:14.600 1 VIGENTE 2020-07-23 22:13:39.583
(3 rows affected)
Pero poco más de 1 minuto después, obtengo esto:
id FechaExpiracion compEstaExpirado compEstadoActual FechaActual
-------------------- ----------------------- ---------------- ---------------- -----------------------
1 2020-01-01 17:12:14.000 0 VENCIDO 2020-07-23 22:15:19.107
2 2021-12-31 11:14:12.000 1 VIGENTE 2020-07-23 22:15:19.107
3 2020-07-23 22:14:14.600 0 VENCIDO 2020-07-23 22:15:19.107
(3 rows affected)
Como puedes observar, la última fila ha vencido de manera automática al llegar la fecha/hora de vencimiento sin la necesidad de hacer nada más que el diseño de la tabla con columnas calculadas.
Answered by jachguate on December 4, 2021
Esto lo puedes lograr con el Agente de SQL Server, sin embargo deberás validar que tienes acceso a este o que tu versión del SQL Server lo tiene o soporta. Puedes ver algunos ejemplos en la página de Microsoft.
Answered by Jonnathan Q on December 4, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP