SQL Server에서 두 날짜 간의 시간 차이 (십진수)를 계산하는 방법은 무엇입니까?


84

SQL Server 2008에서 두 날짜 간의 시간 (십진수 유형) 차이를 계산해야합니다.

MSDN에서 'CONVERT'를 사용하여 datetime을 십진수로 변환하는 유용한 기술을 찾을 수 없습니다.
아무도 저를 도와 줄 수 있습니까?

업데이트 :
명확하게하려면 분수 부분도 필요합니다 (따라서 십진수 유형). 따라서 9:00에서 10:30까지 1.5를 반환해야합니다.

답변:


162

DATEDIFF(hour, start_date, end_date)start_date과 사이의 시간 경계를 넘은 시간을 알려줍니다 end_date.

분수 시간이 필요한 경우 DATEDIFF더 높은 해상도에서 사용 하고 결과를 나눌 수 있습니다.

DATEDIFF(second, start_date, end_date) / 3600.0

에 대한 설명서 DATEDIFF는 MSDN에서 사용할 수 있습니다.

http://msdn.microsoft.com/en-us/library/ms189794%28SQL.105%29.aspx


좋은 생각입니다. BTW-동일한 기능이 .Net에도 존재하므로 VB.Net 또는 C #에서 유용합니다.
Jeff

1
왜 DATEDIFF (MINUTE, 시작일, 종료일) / 60.0
irfandar

8
@irfandar datepart전달 된 값 DATEDIFF은 출력의 해상도를 제어합니다. 예를 들면 경우 start_dateend_date59초 의해 상이하고 DATEDIFF(MINUTE, start_date, end_date) / 60.00을 반환하지만 DATEDIFF(second, start_date, end_date) / 3600.00.0163888 (3,600분의 59)을 반환한다.
Phil Ross

이 솔루션은 정수를 반환합니다. 시차가 15 분이면 시간은 0을 반환합니다. 다음 솔루션이 더 현실적이라고 생각합니다.
Asad Naeem

1
@AsadNaeem 솔루션 ( DATEDIFF시간보다 높은 해상도 사용 )이 작동합니다. 예를 들어 SELECT DATEDIFF(second, DATEADD(minute, -15, GETUTCDATE()), GETUTCDATE()) / 3600.00.250000을 반환합니다.
Phil Ross

15

두 개의 datetime 값을 빼고 24를 곱하면됩니다.

  Select Cast((@DateTime2 - @DateTime1) as Float) * 24.0

테스트 스크립트는 다음과 같습니다.

  Declare @Dt1 dateTime Set @Dt1 = '12 Jan 2009 11:34:12'
  Declare @Dt2 dateTime Set @Dt2 = getdate()

  Select Cast((@Dt2 - @Dt1) as Float) * 24.0

이는 모든 날짜 시간이 내부적으로 한 쌍의 정수로 저장되고 첫 번째 정수는 1900 년 1 월 1 일 이후의 일 수이고 두 번째 정수 (시간을 나타냄)는 자정 이후 의 ( 1 ) 틱 수 이기 때문에 작동합니다. (SmallDatetimes의 경우 시간 부분 정수는 자정 이후의 분 수입니다). 값에 대해 수행되는 모든 산술은 시간 부분을 하루의 일부로 사용합니다. 오전 6시 = 0.25, 정오 = 0.5 등 ... 자세한 내용은 여기 MSDN 링크 를 참조하십시오.

따라서 Cast ((@ Dt2-@ Dt1) as Float)는 두 날짜 시간 사이의 총 일수를 제공합니다. 시간으로 변환하려면 24를 곱하십시오. 총 분이 필요한 경우 24 대신 분 단위로 배수 (24 * 60 = 1440) ...

참고 1 : 이것은 dotNet 또는 javaScript 틱과 동일하지 않습니다.이 틱은 약 3.33 밀리 초입니다.


좋은 속임수. SQL은 명명 된 상수를 포함해야합니다. 24를 입력했을 때 더러워졌지만 그것이 Ronald McDonald가 아니기 때문에 얻은 ​​것 같아요.
Allen

10

DATEDIFF 그러나 정수를 반환하므로 시간의 일부가 필요한 경우 다음과 같이 사용하십시오.

CAST(DATEDIFF(ss, startDate, endDate) AS decimal(precision, scale)) / 3600

2

Postgres를 사용하여 DATEDIFF에 문제가 있었지만 성공했습니다.

  DATE_PART('day',(delivery_time)::timestamp - (placed_time)::timestamp) * 24 + 
  DATE_PART('hour',(delivery_time)::timestamp - (placed_time)::timestamp) +
  DATE_PART('minute',(delivery_time)::timestamp - (placed_time)::timestamp) / 60

"14.3"과 같은 결과를 얻었습니다.


0
Declare @date1 datetime
Declare @date2 datetime

Set @date1 = '11/20/2009 11:00:00 AM'
Set @date2 = '11/20/2009 12:00:00 PM'

Select Cast(DateDiff(hh, @date1, @date2) as decimal(3,2)) as HoursApart

결과 = 1.00


1
DateDiff ()는 int를 반환합니다. 십진수로 캐스팅 할 수 있지만 이미 가수가 잘 렸습니다.
Joel Coehoorn

0

DATEDIFF 함수를 찾고있을 것입니다 .

DATEDIFF (datepart, startdate, enddate)

코드는 다음과 같습니다.

DATEDIFF (hh, startdate, enddate)


1
'hh'간격은 그가 원하는 것을하지 않습니다. 그는 분수 시간을 계산할 수 있도록 더 작은 간격이 필요합니다.
Joel Coehoorn

0
DATEDIFF(minute,startdate,enddate)/60.0)

또는 소수점 둘째 자리에 사용하십시오.

CAST(DATEDIFF(minute,startdate,enddate)/60.0 as decimal(18,2))

-1

SELECT DATEDIFF (hh, firstDate, secondDate) FROM tableName WHERE ...


DateDiff ()는 int를 반환합니다. 십진수로 캐스팅 할 수 있지만 이미 가수가 잘 렸습니다.
Joel Coehoorn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.