2009-05-22 9 views
5

Esiste un metodo semplice e pulito per formattare un numero intero che è un conteggio di un numero intero di minuti in una rappresentazione decimale di ore e minuti. È un vero peccato che non ci sia qualcosa come un periodo di tempo in T-SQL per supportare questo.Formato in minuti e minuti come numero decimale in T-SQL

Giusto per essere chiari, ciò che intendo con questo è che se ho 70 minuti, voglio coprirlo in una rappresentazione di 1 ora e 10 minuti, cioè 1.10. Voglio anche tenerlo come un varchar o qualcosa per garantire che lo zero finale sia mantenuto in posizione.

C'è comunque che questo possa essere creato come una funzione personalizzata in SQL in modo che possa essere riutilizzato da diverse query?

risposta

17

Per ottenere le ore, si desidera dividere per 60. Per ottenere i minuti rimanenti, si desidera prendere i minuti totali mod 60 o la differenza tra i minuti totali e le ore 60 volte. Per far apparire il resto alla destra del punto decimale, dividere per 100,0:

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

Nota che perderai la zero finale e la memorizzazione IMHO una durata di tempo in questo modo è una cattiva idea perché a) non si può fare di più per la matematica con esso eb) qualcuno si confonderà quando guarderà questo codice in seguito.

Sei molto meglio di utilizzare una rappresentazione di stringa nel modo seguente (e vi consiglio l'uso di ':' '' invece di nuovo, a significare questo non è un numero):

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

Per quanto riguarda la creazione di una funzione personalizzata, è possibile effettuare una stored procedure e quindi chiamarla da un altro codice. Si noti che la stored procedure dovrà essere creata in ogni database.

Non è sicuro che la procedura memorizzata valga la pena, a meno che non si voglia essere più appassionati e restituire una riga simile a TimeSpan.

+1

Ricorda che se stai per dividere un numero intero e sperare di ottenere i decimali, devi inserire il risultato nel tipo di dati appropriato. – TheTXI

+0

@TheTXI buon punto –

+0

Non penso che capisci cosa intendo. Se ho 70 minuti, voglio coprirlo in una rappresentazione di 1 ora e 10 minuti, cioè 1:10. Riformulerò la mia domanda per chiarire questo punto –

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

ho trascorso un po 'cercando di fare la stessa cosa, ecco come ho fatto:

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 

USCITA:

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

Stai aggiungendo la stessa risposta a più domande? Copia e incolla l'errore o qualcosa del genere? E, per favore, considera che se non aggiungi qualcosa di nuovo alle risposte degli altri, non devi far rivivere un post di 3 anni. Grazie per il tuo impegno, però. – fancyPants

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

In SQL Server 2012:

SELECT format(DATEADD(minute, 70, 0), N'hh\.mm') 
Problemi correlati