Tras mucho buscar en internet, no he encontrado una funcion que directamente devuelva las horas, minutos y segundos contenidos en un numero que pasemos a una funcion. Yo necesitaba hacer algo asi para una funcion en Microsft SQL Server, por lo que me puse manos a la obra.
Luego me puse a pensar... cosa rara en mi, lo se.... y me dije, "Corcho, ahora que la tengo para SQL, la puedo hacer en C-SHARP!!!" y me puse a buscar a ver si ya habia algo por internet, y si, claro que encontre muchas paginas de como hacerlo, pero realmente la forma en que lo hice para SQL me indicaba los años, meses y dias, y de esta manera, si que no encontre nada por internet, aunque he de decir que tampoco me lo curre mucho, ya que como ya lo hice, no iba a perde mucho el tiempo.
Bueno y para no aburrir mucho con mi historia, os dejo los codigos para Microsoft SQL Server y C-SHARP de mi funcion, como siempre, estoy abierto a recibir criticas y que mejoren el codigo en vuestros comentarios.
Microsoft SQL Server
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:
-- Create date: <30 Mar 2017>
-- Description:
-- =============================================
CREATE FUNCTION ShowTime
(
@tiempo as decimal
)
RETURNS varchar(100)
AS
BEGIN
-- Declare the return variable here
declare @resultado varchar(100)
--variables for calculates
DECLARE @horas float
DECLARE @minutos float
DECLARE @segundos float
DECLARE @retorno varchar(12)
DECLARE @dias int = 0
DECLARE @meses int = 0
DECLARE @years int = 0
--convertir el tiempo en milisegundos
select @horas = FLOOR(@tiempo / 3600)
while @horas > 23
begin
select @tiempo = @tiempo - 86400
select @horas = FLOOR(@tiempo / 3600)
select @dias = @dias + 1
if @dias > 30
begin
select @meses = @meses + 1
if @meses > 12
begin
select @years = @years + 1
select @meses = 0
end
select @dias = 0
end
end
if @horas < 0
begin
select @horas = 0
end
select @tiempo = @tiempo - (@horas * 3600)
select @minutos = FLOOR(@tiempo / 60)
select @segundos = @tiempo - (@minutos * 60)
if @years > 0
begin
select @resultado = CAST(@years as varchar(5)) + ' Years'
end
else
begin
select @resultado = ''
end
if @meses > 0
begin
select @resultado = @resultado + ' ' + CAST(@meses as varchar(2)) + ' Month'
end
else
begin
select @resultado = ''
end
if @dias > 0
begin
select @resultado = @resultado + ' ' + CAST(@dias as varchar(2)) + ' Days'
end
else
begin
select @resultado = ''
end
select @resultado = @resultado + ' ' + CAST(@horas as varchar(2)) + ':'
select @resultado = @resultado + CAST(@minutos as varchar(2)) + ':'
select @resultado = @resultado + CAST(@segundos as varchar(2))
--select @years as years, @meses as meses, @dias as dias, @horas as horas, @minutos as minutos, @segundos as segundos
return @resultado
END
GO
Para utilizxarla en SQL solo hay que hacer un SELECT dbo.ShowTime([segundos]) y listo. Si por ejemplo necesitas saber el cuanto tiempo ha pasado entre dos fechas, que es para lo que cree esto, la consulta podria ser algo asi SELECT dbo.ShowTime(DATEDIFF(SECOND,StartTime, EndTime)) as tiempo, tener en cuenta que los campos StartTime y EndTime tiene que ser campos DATETIME ya que si no siempre devolveria 24 horas.
C-SHARP
///
/// Obtener el tiempo representado en horas:minutos:segundos
///
/// Segundos a calcular
/// Mostrar dias, meses y años (años, meses, dias, horas:minutos:segundos)
/// Formato para mostrar las horas
/// Formato para mostrar los dias. Recordar hay que separar dias de horas
///
public string secondsToTime(double secs, bool showDays, string formatHours = "{0:D2}:{1:D2}:{2:D2}", string formatDays = "{0}:{1}:{2}")
{
int hor = 0, min = 0, seg = 0;
int days = 0, month = 0, years = 0;
hor = (int)(secs / 3600); //calcular las horas
while (hor > 23) //calcular los dias, meses o años pasados
{
secs = secs - 86400;
hor = (int)(secs / 3600);
days++;
if (days > 30)
{
month++;
if (month > 12)
{
years++;
month = 0;
}
days = 0;
}
}
secs = secs - (hor * 3600); //calcular el resto de segundos que quedan despues de quitar las horas pasadas
min = (int)(secs / 60); //calcular los minutos que hay en los segundos restantes
seg = (int)(secs - (min * 60)); //calcular los segundos restantes al quitar los minutos
if (showDays == true) return string.Format(formatDays, years, month, days) + string.Format(formatHours, hor, min, seg); //decuelve años, minutos, dias, horas:minutos:segundos
else return string.Format(formatHours, hor, min, seg); //devuelve solo horas:minutos:segundos
}
C-SHARP (simpliciado)
Esta segunda manera, resulta que ya la tenia yo entre mis funciones, hay que joderse y yo buscando de nuevo en internet, pero a diferencia de la otra manera, calculando, en esta forma devuelve siempre el TOTAL de dias y no cuantos meses y años hay en la fecha indicada.
///
/// Convert Seconds in Time. Can return string with tag for slip. With tag first are days, hours, min, sec
///
/// Total Seconds to convert
/// Tag use for can split.
/// Format for use. Defaut Hour:Min:Sec "{0:D2}:{1:D2}:{2:D2}". If need days wirte a correct format with 4 items.
///
public string secondsToTime(double secs, string tag = "", string format = "{0:D2}:{1:D2}:{2:D2}", bool showDays = false)
{
string formatHour = "";
TimeSpan time = TimeSpan.FromSeconds(secs);
if (tag == "")
if (showDays == false)
formatHour = string.Format(format, time.Hours, time.Minutes, time.Seconds);
else
formatHour = string.Format("{3}D" + format, time.Hours, time.Minutes, time.Seconds, time.Days);
else
formatHour = time.Days.ToString() + tag + string.Format(format, time.Hours, time.Minutes, time.Seconds);
return formatHour;
}
Happy Coding ;P
#SQL #CSHARP