TransWikia.com

Como actualizar un valor en sql server de forma automática llegada una fecha

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?.

2 Answers

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP