Làm thế nào để tính toán chênh lệch theo giờ (thập phân) giữa hai ngày trong SQL Server?


84

Tôi phải tính toán sự khác biệt về giờ (kiểu thập phân) giữa hai ngày trong SQL Server 2008.

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

CẬP NHẬT:
Để rõ ràng, tôi cũng cần phần phân số (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.

Câu trả lời:


162

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 số, bạn có thể sử dụng DATEDIFFở độ phân giải cao hơn và chia kết quả:

DATEDIFF(second, start_date, end_date) / 3600.0

Tài liệu cho DATEDIFFcó sẵn trên MSDN:

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


Ý tưởng tuyệt vời. BTW - các chức năng tương tự cũng 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

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

8
@irfandar Giá trị datepartđược chuyển tới DATEDIFFsẽ kiểm soát độ phân giải của đầu ra. Ví dụ: nếu start_datevà chênh lệch end_date59 giây, thì DATEDIFF(MINUTE, start_date, end_date) / 60.0sẽ trả về 0, nhưng DATEDIFF(second, start_date, end_date) / 3600.0sẽ trả về 0,0163888 (59/3600).
Phil Ross

giải pháp này chỉ là trả về số nguyên. nếu thời gian chênh lệch chỉ là 15 phút thì giờ đang quay về 0. Tôi nghĩ giải pháp sau đây thực tế hơn.
Asad Naeem

1
@AsadNaeem Giải pháp (sử dụng DATEDIFFở độ phân giải cao hơn giờ) hoạt động. Ví dụ: SELECT DATEDIFF(second, DATEADD(minute, -15, GETUTCDATE()), GETUTCDATE()) / 3600.0trả về 0,250000.
Phil Ross

15

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 tập lệnh 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

Điều này hoạt động vì tất cả lịch ngày được lưu trữ bên trong dưới dạng một cặp số nguyên, số nguyên đầu tiên là số ngày kể từ ngày 1 tháng 1 năm 1900 và số nguyên thứ hai (đại diện cho thời gian) là số ( 1 ) dấu tích 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). Bất kỳ phép tính nào được thực hiện trên các giá trị đều sử dụng phần thời gian dưới dạng một phần nhỏ của ngày. 6 giờ sáng = 0,25, trưa = 0,5, v.v ... Xem liên kết MSDN tại đây để biết thêm chi tiết.

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

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


Bí quyết đẹp. SQL nên 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 nếu không phải là Ronald McDonald.
Allen

10

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

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

2

Sử dụng Postgres, tôi gặp sự cố với DATEDIFF, nhưng đã thành công với điều này:

  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

đã cho tôi một kết quả như "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

Kết quả = 1,00


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

0

Có thể bạn đang tìm hàm DATEDIFF .

DATEDIFF (ngày tháng, ngày bắt đầu, ngày kết thúc)

Nơi 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 để anh ta có thể tính số giờ theo phân số.
Joel Coehoorn

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

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

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

-1

CHỌN DATEDIFF (hh, firstDate, secondDate) FROM tableName WHERE ...


DateDiff () trả về một int. Bạn có thể truyền sang thập phân, nhưng nó đã bị cắt ngắn phần định trị.
Joel Coehoorn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.