2009-11-20 71 views
64

Tôi phải tính chênh lệch theo giờ (loại thập phân) giữa hai ngày trong SQL Server 2008.Cách tính chênh lệch theo giờ (thập phân) giữa hai ngày trong SQL Server?

Tôi không thể tìm thấy bất kỳ kỹ thuật hữu ích nào để chuyển đổi datetime sang thập phân bằng 'CONVERT' trên MSDN.
Ai đó có thể giúp tôi với điều đó không?

CẬP NHẬT:
Để rõ ràng, tôi cũng cần phần phân đoạn (do đó loại thập phân). Vì vậy, từ 9:00 đến 10:30 nó sẽ trả lại cho tôi 1.5.

Trả lời

116

DATEDIFF(hour, start_date, end_date) sẽ cung cấp cho bạn số lượng ranh giới giờ vượt qua giữa start_dateend_date.

Nếu bạn cần số giờ phân đoạn, bạn có thể sử dụng DATEDIFF ở độ phân giải cao hơn và phân chia kết quả:

DATEDIFF(second, start_date, end_date)/3600.0 

Các tài liệu cho DATEDIFF có sẵn trên MSDN:

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

+0

Ý tưởng tuyệt vời. BTW - các chức năng tương tự tồn tại trong Net. Vì vậy, điều này rất hữu ích trong VB.Net hoặc C#. – Jeff

+0

Tại sao không DATEDIFF (MINUTE, start_date, end_date)/60.0 – irfandar

+4

@irfandar 'datepart' được chuyển đến' DATEDIFF' sẽ kiểm soát độ phân giải của đầu ra. Ví dụ: nếu 'start_date' và' end_date' khác nhau sau 59 giây, thì 'DATEDIFF (MINUTE, start_date, end_date)/60.0' sẽ trả về 0, nhưng' DATEDIFF (giây, start_date, end_date)/3600.0' sẽ trả về 0.0163888 (59/3600). –

-1
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 

Result = 1.00

+1

DATEDIFF() trả về một int. Bạn có thể truyền sang thập phân, nhưng nó đã cắt ngắn phần định trị. –

+0

Điều cần biết, nhờ @Joel – kd7

-1

CHỌN DATEDIFF (hh, firstDate, secondDate) TỪ tableName Ở ĐÂU ...

+0

DateDiff() trả về một int. Bạn có thể truyền sang thập phân, nhưng nó đã cắt ngắn phần định trị. –

0

Bạn có thể tìm cho DATEDIFF chức năng.

DATEDIFF (datepart, STARTDATE, ENDDATE)

đâu bạn mã có thể trông như thế này:

DATEDIFF (hh, STARTDATE, ENDDATE)

+1

Khoảng thời gian 'hh' sẽ không làm những gì anh ta muốn. Anh ta cần một khoảng thời gian nhỏ hơn để có thể tính toán số giờ phân đoạn. –

8

DATEDIFF nhưng lưu ý nó sẽ trả về một số nguyên vì vậy nếu bạn cần phân số giờ sử dụng một cái gì đó như thế này: -

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

Downvoter, nêu lý do của bạn ?? – AnthonyWJones

11

Chỉ cần trừ hai giá trị ngày giờ và nhân với 24:

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

một kịch bản thử nghiệm có thể là:

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 

này hoạt động bởi vì tất cả datetimes được lưu trữ nội bộ như một cặp số nguyên, số nguyên đầu tiên là số ngày kể từ ngày 1 tháng một năm 1900, và số nguyên thứ hai (đại diện cho thời gian) là số() bọ ve kể từ nửa đêm. (Đối với SmallDatetimes số nguyên phần thời gian là số phút kể từ nửa đêm). Mọi số học được thực hiện trên các giá trị sử dụng phần thời gian như một phần của một ngày. 6 giờ sáng = 0,25, buổi trưa = 0,5, v.v ... Xem MSDN link here để biết thêm chi tiết.

Vì vậy, Cast ((@ Dt2 - @ Dt1) dưới dạng Float) cung cấp cho bạn tổng số ngày giữa hai thời gian biểu. Nhân với 24 để chuyển đổi thành giờ.Nếu bạn cần tổng số phút, nhiều theo phút mỗi ngày (24 * 60 = 1440) thay vì 24 ...

LƯU Ý 1: Điều này không giống như dấu chấm chấm hoặc đánh dấu javaScript - dấu tích này là khoảng 3,33 mili giây.

+0

Mẹo hay. SQL phải bao gồm một hằng số được đặt tên. Tôi cảm thấy bẩn khi gõ 24, nhưng tôi đoán đó là những gì tôi nhận được vì không phải là Ronald McDonald. – Allen

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

Hoặc sử dụng này cho 2 chữ số thập phân:

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

Vui lòng giải thích câu trả lời của bạn và cách hoạt động. –

Các vấn đề liên quan