Por seguir un poco con los trucos para SQL sobre el tema de fechas y además ver como aplicar el principio de responsabilidad única, hoy os traigo otras 3 funciones muy interesantes.
Vamos a ver como representar el tiempo transcurrido entre dos fechas en un formato que nos diga días horas minutos y segundos. Y, para mantener una nomenclatura algo internacional, vamos a representarlo como 4d10:25:15, es decir 4 días, 10 horas, 25 minutos y 15 segundos. Primero veamos cómo obtener la diferencia de tiempo entre dos fechas en SQL.
select DATEDIFF(DAY, '2022-06-27 00:49:29.390', '2022-06-27 00:56:41.603') dias
select DATEDIFF(HOUR, '2022-06-27 00:49:29.390', '2022-06-27 00:56:41.603') horas
select DATEDIFF(MINUTE, '2022-06-27 00:49:29.390', '2022-06-27 00:56:41.603') minutos
select DATEDIFF(SECOND, '2022-06-27 00:49:29.390', '2022-06-27 00:56:41.603') segundos
Bien, teniendo en cuenta esto, podríamos hacer una función que nos devuelva los días, horas, minutos y segundos con el formato deseado calculando siempre desde los segundos transcurridos.
¿Y por qué desde los segundos transcurridos? Pues porque será donde menos pérdidas por redondeo tengamos cuando estemos haciendo los cálculos. Para ello crearemos una primera función que hará precisamente este trabajo.
CREATE FUNCTION datediff_human_read_from_seconds
(
@total_seconds INT
)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @days INT, @hours INT, @minutes INT, @seconds INT, @result VARCHAR(100);
SET @days = @total_seconds / 86400; -- 86400 segundos en un día
SET @hours = (@total_seconds % 86400) / 3600; -- Resto de segundos divididos en horas
SET @minutes = (@total_seconds % 3600) / 60; -- Resto de segundos divididos en minutos
SET @seconds = @total_seconds % 60; -- Resto de segundos
SET @result = CAST(@days AS VARCHAR) + 'd' +
FORMAT(@hours, '00') + ':' +
FORMAT(@minutes, '00') + ':' +
FORMAT(@seconds, '00');
RETURN @result;
END
Ahora, si así lo deseas, podríamos hacer una función que calculara lo mismo, pero desde los minutos. Teniendo en cuenta que lo que vamos a recibir son minutos, nuestro tiempo siempre terminará con cero segundos, ya que no podremos saber cuántos segundos han pasado. Para ello esta función, y aquí es donde se muestra el principio de SRP (Single Responsability Principle, o principio de responsabilidad única) pero aplicado en SQL.
Nuestra función que va a devolver el tiempo transcurrido desde unos minutos suministrados, se va a apoyar en la función que convierte desde segundos, de esta manera nuestro código es más fácil de entender, y sobre todo, de mantener.
Para ello lo primero que debemos hacer es convertir los minutos suministrados a segundos e invocar a la función que nos convierte los segundos en tiempo transcurrido pasando como parámetro los segundos calculados desde los minutos suministrados, es por esto que nuestro tiempo siempre terminara con cero segundos.
CREATE FUNCTION datediff_human_read_from_minute
(
@total_minutes INT
)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @total_seconds INT;
SET @total_seconds = @total_minutes * 60;
RETURN dbo.datediff_human_read_from_seconds(@total_seconds);
END
Por último, y creo yo que la función que más puede ser utilizada, crearemos una función que reciba como parámetros una fecha de inicio y otra de finalización, para calcular el tiempo transcurrido desde estas dos fechas.
Esta función lo que va a hacer, apoyándose de la función DATEFIFF es calcular los segundos transcurridos entre las dos fechas, y pasar este resultado a la función que nos devuelve el tiempo transcurrido desde segundos. De nuevo el enfoque de SRP aplicado a SQL.
CREATE FUNCTION datedif_human_read
(
@start_date DATETIME,
@end_date DATETIME
)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @total_seconds INT;
SELECT @total_seconds = DATEDIFF(SECOND, @start_date, @end_date);
RETURN dbo.datediff_human_read_from_seconds(@total_seconds);
END
Si, por cualquier razón, necesitáramos cambiar el formato de salida, solo tenemos que ajustar la función que convierte desde segundos y todas nuestras funciones ya estarían actualizadas, es por ello que al aplicar SRP en SQL nuestro código queda mejor estructurado.
Y ya, esto es todo por hoy, espero que les gusten todos estros trucos de SQL.
Happy coding