2009-05-22 16 views
5

¿Existe un método simple y limpio para formatear un entero que es un recuento de un número entero de minutos en una representación decimal de horas y minutos. Es una gran lástima que no exista un Timespan en T-SQL para apoyar esto.Formatear minutos en horas y minutos como un número decimal en T-SQL

Para que quede claro lo que quiero decir con esto es si tengo 70 minutos, quiero convertirlo en una representación de 1 hora y 10 minutos, es decir, 1.10. También querré mantenerlo como varchar o algo así para garantizar que el cero final se mantenga en su lugar.

¿Hay alguna forma de que esto se pueda crear como una función personalizada en SQL para que pueda ser reutilizada desde diferentes consultas?

Respuesta

17

Para obtener las horas, desea dividir por 60. Para obtener los minutos restantes, desea tomar el mod total de minutos 60 o la diferencia entre el total de minutos y horas multiplicado por 60. Para que el resto parezca la derecha de la coma decimal, se divide por 100,0:

SELECT minutes/60 + (minutes % 60)/100.0 ... 

Tenga en cuenta que si no se pierden el cero final y almacenar en mi humilde opinión una duración de tiempo de esta manera es una mala idea porque a) no se puede hacer nada más matemáticas con eso yb) alguien se confundirá cuando vea este código más adelante.

Es mucho mejor usar una representación de cadena como la siguiente (y recomiendo el uso de ':' '' en vez de nuevo, para significar esto no es un número):

SELECT CAST((minutes/60) AS VARCHAR(8)) + ':' + 
     RIGHT('0' + CAST((minutes % 60) AS VARCHAR(2)), 2) ... 

En cuanto a la creación de una función personalizada, puede hacer un procedimiento almacenado y luego llamarlo desde otro código. Tenga en cuenta que el procedimiento almacenado deberá crearse en cada base de datos.

No estoy seguro si hacer el procedimiento almacenado bien vale la pena, a menos que desee ser más elegante y devolver una fila similar a TimeSpan.

+1

Solo recuerda que si vas a dividir un entero y esperar recuperar los decimales, debes poner el resultado en el tipo de datos apropiado. – TheTXI

+0

@TheTXI buen punto –

+0

No creo que entiendas lo que quiero decir. Si tengo 70 minutos, quiero encubrirlo en una representación de 1 hora y 10 minutos, es decir, 1:10. Voy a reformular mi pregunta para dejar esto en claro –

1
select 70/60 + (70 % 60)/100.0 
0

Pasé un tiempo tratando de hacer lo mismo, aquí está cómo lo he hecho:

convert(varchar, cast((RouteMileage/@average_speed) as integer))+ ':' + convert(varchar, cast((((RouteMileage/@average_speed) - cast((RouteMileage/@average_speed) as integer)) * 60) as integer)) As TravelTime, 

dateadd(n, -60 * CAST((RouteMileage/@average_speed) AS DECIMAL(7,2)), @entry_date) As DepartureTime 

SALIDA:

DeliveryDate    TravelTime    DepartureTime 
2012-06-02 12:00:00.000  25:49   2012-06-01 10:11:00.000 
+1

¿Está agregando la misma respuesta a preguntas múltiples y diferentes? ¿Copiar y pegar un error o algo así? Y considere, si no agrega algo nuevo a las respuestas de los demás, no tiene que revivir una publicación de 3 años. Gracias por tu esfuerzo, sin embargo. – fancyPants

0
CAST(Duration/60 + (duration % 60) /100.0 as Decimal(10,1)) 
-1

En SQL Server 2012:

SELECT format(DATEADD(minute, 70, 0), N'hh\.mm') 
Cuestiones relacionadas