2010-02-23 11 views
10

Załóżmy, że mam 90 sekund. Jeśli chcę, aby wyświetlić wynik w kategoriach minuty i sekundy, to zrobić za pomocąEfektywny sposób konwertowania sekund do minut i sekund w serwerze sql 2005

select Time= '0' + CAST(90/60 as varchar(2)) + ':' + CAST(90%60 as varchar(2)) 

Wyjście jest

Czas
01:30

Mam dołączone 0 (zero), ponieważ jeśli wykonasz select getdate(), wynik będzie wynosił

rrrr-mm-dd gg: mm: ss: ms

Jaki jest standardowy sposób i zalecana praktyka takiego przeliczenia?

Dzięki

Odpowiedz

23

W godzinach:

SELECT CONVERT(CHAR(8),DATEADD(second,90,0),108) 
00:01:30 

godzin Ignorowanie:

SELECT RIGHT(CONVERT(CHAR(8),DATEADD(second,90,0),108),5) 
01:30 
+0

To świetnie .. ale jest również pokazywanie pole recepcję. Potrzebuję tylko mm: ss. Czy powinienem użyć prawa do tego, na przykład SELECT prawy (CONVERT (CHAR (8), DATEADD (drugi, 90,0), 108), 5). Lub jakikolwiek standardowy sposób jest tam –

+0

Tak, edytowałem kiedy opublikowałeś swój komentarz. –

+0

To nie działa z sekundami równymi lub wyższymi niż te w jednym dniu: WYBIERZ KONWERTER (CHAR (8), DATEADD (drugi, 86400,0), 108) – gotqn

0

Jedną z pierwszych rzeczy zrobić na świeżym bazy danych SQL jest dodać Timespan funkcję podobną do tej jednej (chociaż zwykle obejmuję również dni i milisekundy):

CREATE FUNCTION dbo.TimeSpan 
(
    @Hours int, 
    @Minutes int, 
    @Seconds int 
) 
RETURNS datetime 
AS BEGIN 
    RETURN DATEADD(SS, @Hours * 3600 + @Minutes * 60 + @Seconds, 0) 
END 

Następnie można sformatować ten jednak chcesz:

SELECT SUBSTRING(CONVERT(char(8), dbo.TimeSpan(0, 0, 90), 108), 4, 5) 

To może wyglądać bardziej skomplikowane w pierwszym, ale zdolność do ponownego wykorzystania funkcji TimeSpan jest bardzo przydatna w czasie. Dla mnie czuję się jak haker, który zawsze pisze DATEADD połączeń z 0 lub '1753-01-01'.

+0

To rozwiązanie działa tylko z małymi numerami. Na przykład, jeśli masz 82816 sekund niż SELECT SUBSTRING (CONVERT (char (8), dbo.TimeSpan (0, 0, 82816), 108), 4, 5) zwraca tylko 16 sekund! – Dave

3

Spróbuj tego:

select convert(varchar(10), dateadd(second, 15794, 0), 108) 
Powiązane problemy