2013-02-13 8 views
5

Może skorzystać z pomocy guru na ten temat. Próbując obliczyć czas pomiędzy dwoma wartościami datetime i pokazują, jak raz w zapytaniu T-SQL ...Formatowanie T-SQL kolumna jako czas

SELECT arrivalDate - departDate AS timeToComplete 

To powinno być zawsze mniej niż 24 godzin. Ale kto wie, co może wprowadzić użytkownik?

Próbowałem czegoś takiego bez żadnych powtórzeń.

SELECT 
    CAST(time(7), 
    CONVERT(datetime, arrivalDate - departDate) AS timeToComplete) AS newTime, 

Zamiast pokazywać wyniki jak 1:23:41 jako przykład, czy jest jakiś sposób, aby pokazać wyniki, takie jak:

0D, 1H, 23M, 33S. 

Dzięki za wszelkie wytyczne w tej sprawie.

+0

możesz również spojrzeć na mój zaktualizowany przykład, który spełnia twoje wymagania w instrukcji select. –

Odpowiedz

2

Wystarczy być inaczej :) spróbuje użyć tego podejścia:

DECLARE @ date1 datetime; declare @ date2 datetime;

set @date1 = '2012-05-01 12:00:000' 
set @date2 = '2012-05-01 18:00:000' 


    SELECT 
    STUFF(
     STUFF(
      STUFF(
       RIGHT(CONVERT(NVARCHAR(19), CONVERT(DATETIME, DATEADD(second, DATEDIFF(S, @date1, @date2), '20000101')), 120), 11), 
       3, 1, 'D, '), 
      8, 1, 'H, '), 
     13, 1, 'M, ') + ' S'; 
+0

Nie jestem pewien, czy rozumiem, co próbujesz przekazać tutaj. Najpierw brakuje pewnej liczby nawiasów i chciałbym użyć tego w instrukcji SELECT. – htm11h

+0

Być może popełniłeś błąd podczas kopiowania zapytania, udało mi się uruchomić to zapytanie. Niestety sqlfiddle nie jest dostępna dla mnie teraz i nie mogę się z tobą podzielić zapytaniem. –

+0

@roman, dlaczego usługa sqlfiddle była niedostępna? Coś nie tak z witryną? –

4

Możesz uzyskać całkowitą różnicę w sekundach, a następnie zabrać większą część z tego. Na przykład zacznij od Dni, a następnie godzin, minut i sekund.

DECLARE @arrivalDate DATETIME = '2013-01-19 23:59:59' 
DECLARE @departDate DATETIME = '2013-01-25 11:52:30' 

DECLARE @SecondsDifference INT = DATEDIFF(SECOND, @arrivalDate, @departDate) 

DECLARE @DayDifference INT = @SecondsDifference/86400 
DECLARE @HourDifference INT = (@SecondsDifference - (@DayDifference * 86400))/3600 
DECLARE @MinDifference INT = (@SecondsDifference - (@DayDifference * 86400) - (@HourDifference * 3600))/60 
DECLARE @SecDifference INT = (@SecondsDifference - (@DayDifference * 86400) - (@HourDifference * 3600) - (@MinDifference * 60)) 

Zrobiłem to tutaj używając zmiennych dla jasności, ale mógłbyś to zrobić w pojedynczym zapytaniu. DATEDIFF nie będzie działać dla mniejszych porcji różnicy, dopóki nie usuniesz większych, ponieważ dostaniesz sumy. Na przykład:

DATEDIFF(HOUR, @arrivalDate, @departDate) 

zwróci całkowitą liczbę godzin, a nie godziny mniej za całe dni.

+0

Wow, to może być trudne do zakodowania, ale myślę, że prawdopodobnie najlepiej poradzi sobie z moim problemem. Próbuje to zrobić w formancie źródła danych SQL. Dzięki – htm11h

+0

Może być odpowiednia funkcja w funkcji zwracającej w pełni sformatowany ciąg znaków (np. "0D, 12H, 30M, 25S") lub zwracająca zestaw danych z kolumnami Dni pełnych, godzin, minut, sekund. W ten sposób możesz nazwać go w linii w swoim źródle danych. – Bill

+0

Wysłałem aktualizację, z linkiem do rozwiązania, które wydaje się działać całkiem nieźle. dzięki jeszcze raz, – htm11h