2014-11-18 8 views
9

두 시간 사이의 시차가 필요합니다.SQL Server에서 시차를 계산하십시오.

start time | End Time  
11:15:00 | 13:15:00  
10:45:00 | 18:59:00 

I가 11:15 12:00 12과 타인의 차이에 대응 45,60,15 같은 첫 번째 행에 대한 출력을 필요 아래와 같이 I의 시작 시간과 종료 시간을 구비하고 : 00 및 13:00, 13:00 및 13:15

아무도 도와주세요. 미리 감사드립니다. 분 차이

+0

당신이 원하는 출력을 게시 할 수 있습니까 ?? – mohan111

+0

아직 시도한 것이 있습니까? – danish

+0

데이터의 첫 번째 행에 대한 출력이 45,60,15이어야합니다. 값을 별도의 열로 인쇄하기에 충분합니다. –

답변

12

개 다음 작품은 예상대로 :

SELECT Diff = CASE DATEDIFF(HOUR, StartTime, EndTime) 
        WHEN 0 THEN CAST(DATEDIFF(MINUTE, StartTime, EndTime) AS VARCHAR(10)) 
        ELSE CAST(60 - DATEPART(MINUTE, StartTime) AS VARCHAR(10)) + 
         REPLICATE(',60', DATEDIFF(HOUR, StartTime, EndTime) - 1) + 
         + ',' + CAST(DATEPART(MINUTE, EndTime) AS VARCHAR(10)) 
       END 
FROM (VALUES 
      (CAST('11:15' AS TIME), CAST('13:15' AS TIME)), 
      (CAST('10:45' AS TIME), CAST('18:59' AS TIME)), 
      (CAST('10:45' AS TIME), CAST('11:59' AS TIME)) 
     ) t (StartTime, EndTime); 

가, 24 열을 얻으려면 24의 경우 식, 같은 것을 사용할 수 있습니다

SELECT [0] = CASE WHEN DATEDIFF(HOUR, StartTime, EndTime) = 0 
         THEN DATEDIFF(MINUTE, StartTime, EndTime) 
        ELSE 60 - DATEPART(MINUTE, StartTime) 
       END, 
     [1] = CASE WHEN DATEDIFF(HOUR, StartTime, EndTime) = 1 
         THEN DATEPART(MINUTE, EndTime) 
        WHEN DATEDIFF(HOUR, StartTime, EndTime) > 1 THEN 60 
       END, 
     [2] = CASE WHEN DATEDIFF(HOUR, StartTime, EndTime) = 2 
         THEN DATEPART(MINUTE, EndTime) 
        WHEN DATEDIFF(HOUR, StartTime, EndTime) > 2 THEN 60 
       END -- ETC 
FROM (VALUES 
      (CAST('11:15' AS TIME), CAST('13:15' AS TIME)), 
      (CAST('10:45' AS TIME), CAST('18:59' AS TIME)), 
      (CAST('10:45' AS TIME), CAST('11:59' AS TIME)) 
     ) t (StartTime, EndTime); 

다음은 또한 작동하고, 같은 반복보다 짧은 끝낼 수를 CASE 표현식 반복 :

그것은으로 다시 케이스 표현 이들 24 개 번호를 압연, 반복 할 필요가 없다, 그래서 24 수의 테이블에 가입하여 작동
WITH Numbers (Number) AS 
( SELECT ROW_NUMBER() OVER(ORDER BY t1.N) - 1 
    FROM (VALUES (1), (1), (1), (1), (1), (1)) AS t1 (N) 
      CROSS JOIN (VALUES (1), (1), (1), (1)) AS t2 (N) 
), YourData AS 
( SELECT StartTime, EndTime 
    FROM (VALUES 
       (CAST('11:15' AS TIME), CAST('13:15' AS TIME)), 
       (CAST('09:45' AS TIME), CAST('18:59' AS TIME)), 
       (CAST('10:45' AS TIME), CAST('11:59' AS TIME)) 
      ) AS t (StartTime, EndTime) 
), PivotData AS 
( SELECT t.StartTime, 
      t.EndTime, 
      n.Number, 
      MinuteDiff = CASE WHEN n.Number = 0 AND DATEDIFF(HOUR, StartTime, EndTime) = 0 THEN DATEDIFF(MINUTE, StartTime, EndTime) 
           WHEN n.Number = 0 THEN 60 - DATEPART(MINUTE, StartTime) 
           WHEN DATEDIFF(HOUR, t.StartTime, t.EndTime) <= n.Number THEN DATEPART(MINUTE, EndTime) 
           ELSE 60 
          END 
    FROM YourData AS t 
      INNER JOIN Numbers AS n 
       ON n.Number <= DATEDIFF(HOUR, StartTime, EndTime) 
) 
SELECT * 
FROM PivotData AS d 
     PIVOT 
     ( MAX(MinuteDiff) 
      FOR Number IN 
      ( [0], [1], [2], [3], [4], [5], 
       [6], [7], [8], [9], [10], [11], 
       [12], [13], [14], [15], [16], [17], 
       [18], [19], [20], [21], [22], [23] 
      ) 
     ) AS pvt; 

열을 사용하여 PIVOT

+1

굉장! 감사. 24 개의 열이 필요하고 적용 할 수없는 경우 값을 0으로해야한다고 가정합니다. 어떻게 달성 할 수 있습니까? –

+0

가장자리의 경우 null이됩니다. 예 : '23 : 55 ', '00 : 05' – pkExec

+0

@pkExec PIVOT 솔루션에는 약간의 문제가 있습니다. 그러나 당신이 언급 한 "가장자리"사례는 엣지 케이스가 아니라고 생각합니다. 위의 솔루션은 종료 시간 이후의 시작 시간을 처리하도록 설계되었습니다. – GarethD

22

사용 DateDiff :

SELECT DATEDIFF(MINUTE, '11:10:10' , '11:20:00') AS MinuteDiff 

쿼리 당신을 도울 수 있습니다

SELECT StartTime, EndTime, DATEDIFF(MINUTE, StartTime , EndTime) AS MinuteDiff 
FROM TableName 
-1

이 시도 ..

select starttime,endtime, case 
    when DATEDIFF(minute,starttime,endtime) < 60 then DATEDIFF(minute,starttime,endtime) 
    when DATEDIFF(minute,starttime,endtime) >= 60 
    then '60,'+ cast((cast(DATEDIFF(minute,starttime,endtime) as int)-60) as nvarchar(50)) 
end from TestTable123416 

당신이 필요로하는 모든 DateDiff입니다 ..