SQL सर्वर में दो तिथियों के बीच घंटों (दशमलव) में अंतर की गणना कैसे करें?


84

मुझे SQL Server 2008 में दो तिथियों के बीच घंटों (दशमलव प्रकार) में अंतर की गणना करनी है।

मुझे MSDN पर 'CONVERT' के साथ डेटाटाइम को दशमलव में बदलने के लिए कोई उपयोगी तकनीक नहीं मिली।
क्या कोई मेरी मदद कर सकता है?

अद्यतन:
स्पष्ट होने के लिए, मुझे भिन्नात्मक भाग की आवश्यकता है (इस प्रकार दशमलव प्रकार)। तो 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

के लिए प्रलेखन DATEDIFFMSDN पर उपलब्ध है:

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


महान विचार। BTW - एक ही फ़ंक्शन .Net में मौजूद है इसलिए यह VB.Net या C # में उपयोगी है।
जेफ

1
क्यों नहीं DatedIFF (MINUTE, start_date, end_date) / 60.0
irfandar

8
@irfandar datepartके लिए पारित DATEDIFFउत्पादन के संकल्प का नियंत्रण रहेगा। उदाहरण के लिए यदि start_dateऔर end_date59 सेकंड से भिन्न है, तो DATEDIFF(MINUTE, start_date, end_date) / 60.00 वापसी होगी, लेकिन DATEDIFF(second, start_date, end_date) / 3600.0.०१,६३,८८८ (59/3600) लौट आते हैं।
फिल रॉस

यह समाधान केवल पूर्णांक संख्या लौटा रहा है। यदि समय का अंतर केवल 15 मिनट है तो घंटा वापस आ रहा है। मुझे लगता है कि निम्नलिखित समाधान अधिक यथार्थवादी है।
असद नईम

1
@AsadNaeem समाधान ( DATEDIFFघंटे से अधिक रिज़ॉल्यूशन पर उपयोग ) काम करता है। उदाहरण के लिए, SELECT DATEDIFF(second, DATEADD(minute, -15, GETUTCDATE()), GETUTCDATE()) / 3600.00.250000 रिटर्न।
फिल रॉस

15

बस दो डेटाइम मानों को घटाएँ और 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

यह काम करता है क्योंकि सभी डेटासेट को पूर्णांक की एक जोड़ी के रूप में आंतरिक रूप से संग्रहीत किया जाता है, पहला पूर्णांक 1 जनवरी 1900 से दिनों की संख्या है, और दूसरा पूर्णांक (समय का प्रतिनिधित्व करते हुए) मध्यरात्रि से ( 1 ) टिक की संख्या है । (SmallDatetimes के लिए मध्याह्न के बाद का समय पूर्णांक मिनट की संख्या है)। मूल्यों पर किया गया कोई भी अंकगणित दिन के अंश के रूप में समय भाग का उपयोग करता है। 6am = 0.25, दोपहर = 0.5, आदि ... अधिक विवरण के लिए यहां MSDN लिंक देखें।

तो Cast ((@ Dt2 - @ Dt1) फ्लोट के रूप में) आपको दो डेटासेट के बीच कुल दिन देता है। घंटों में परिवर्तित करने के लिए 24 से गुणा करें। यदि आपको कुल मिनटों की आवश्यकता है, तो 24 के बजाय प्रति दिन (24 * 60 = 1440) प्रति मिनट से अधिक ...

नोट 1 : यह डॉटनेट या जावास्क्रिप्ट टिक के समान नहीं है - यह टिक लगभग 3.33 मिलीसेकंड है।


अच्छी चाल। SQL में एक नामित स्थिरांक शामिल होना चाहिए। मैं 24 टाइप करते समय गंदा महसूस करता था, लेकिन मुझे लगता है कि रोनाल्ड मैकडोनाल्ड नहीं होने के लिए मुझे क्या मिलता है।
एलन

10

दिनांकित लेकिन ध्यान दें कि यह एक पूर्णांक लौटाता है, इसलिए यदि आपको घंटों के अंशों की आवश्यकता हो तो कुछ इस तरह का उपयोग करें: -

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

2

पोस्टग्रैड्स के उपयोग से मेरे पास डेटेडिफ के साथ समस्याएँ थीं, लेकिन इसके साथ सफलता मिली:

  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 देता है। आप दशमलव में डाल सकते हैं, लेकिन यह पहले से ही मंटिसा को काट दिया गया है।
जोएल कोएहॉर्न

0

आप शायद DatedIFF फ़ंक्शन की तलाश कर रहे हैं ।

DatedIFF (तारीख, शुरुआत, अंतिम तिथि)

जहाँ आप कोड इस तरह लग सकते हैं:

DatedIFF (hh, startdate, enddate)


1
'Hh' अंतराल वह नहीं करेगा जो वह चाहता है। उसे एक छोटे अंतराल की आवश्यकता होती है ताकि वह भिन्नात्मक घंटों की गणना कर सके।
जोएल कोएहॉर्न

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

या 2 दशमलव स्थानों के लिए इसका उपयोग करें:

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

-1

चयनित दिनांकित (hh, firstDate, secondDate) तालिका के नाम से ...


DateDiff () एक int देता है। आप दशमलव में डाल सकते हैं, लेकिन यह पहले से ही मंटिसा को काट दिया गया है।
जोएल कोएहॉर्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.