2008-09-17 15 views
5

मेरे पास मेरे डेटाबेस में एक टेबल है, रिकॉर्ड एक विशिष्ट कार्य के लिए शुरू होते हैं और बंद करते हैं। यहाँ डेटा का एक नमूना है:ट्रांजैक्ट-एसक्यूएल समाप्त होने के लिए

Start      Stop 
9/15/2008 5:59:46 PM  9/15/2008 6:26:28 PM 
9/15/2008 6:30:45 PM  9/15/2008 6:40:49 PM 
9/16/2008 8:30:45 PM  9/15/2008 9:20:29 PM 
9/16/2008 12:30:45 PM  12/31/9999 12:00:00 AM 

मैं एक स्क्रिप्ट है कि इन समय फ्रेम के लिए बीता मिनट तक योग लिखने के लिए चाहते हैं, और जहाँ कहीं भी एक 12/31/9999 तारीख है, मैं इसे उपयोग करना चाहते हैं वर्तमान तिथि और समय, क्योंकि यह अभी भी प्रगति पर है।

मैं ट्रांजैक्ट-एसक्यूएल का उपयोग करके यह कैसे करूँगा?

उत्तर

11
SELECT SUM(CASE WHEN Stop = '31 dec 9999' 
        THEN DateDiff(mi, Start, Stop) 
        ELSE DateDiff(mi, Start, GetDate()) 
      END) AS TotalMinutes 
FROM task 

हालांकि, एक बेहतर समाधान रोक क्षेत्र नल बनाने के लिए, और यह शून्य कर जब कार्य अभी भी चल रहा है करने के लिए किया जाएगा। इस तरह, आप ऐसा कर सकता है:

SELECT SUM(DateDiff(mi, Start, IsNull(Stop, GetDate())) AS TotalMinutes 
FROM task 
0

datediff function बीत चुके मिनट प्रदर्शित कर सकते हैं। यह आप दूसरे देना - 12/31/9999 जांच करने के लिए अगर बयान मैं पाठक ;-)

0

--you DateDiff मिनट

के लिए मील का उपयोग कर

साथ खेल सकते हैं के लिए एक अभ्यास के रूप में छोड़ देंगे प्रत्येक कार्य

select Start, 
     Stop, 
     CASE 
      WHEN Stop = '9999-12-31' THEN datediff(ss, start,getdate()) 
      ELSE datediff(ss, start,stop) 
     END duration_in_seconds 

from mytable 

की - योग

Select Sum(duration_in_seconds) 
from 
(
select Start, 
     Stop, 
     CASE 
      WHEN Stop = '9999-12-31' THEN datediff(ss, start,getdate()) 
      ELSE datediff(ss, start,stop) 
     END duration_in_seconds 

from mytable)x 
0

DateDiff रूप में आप अपने अंतर में और अधिक dateparts है उपयोग करने के लिए अधिक मुश्किल हो जाता (यानी आपके मामले में, मिनट और सेकंड की तरह लग रहा है, कभी कभी घंटे)। सौभाग्य से, टीएसक्यूएल के अधिकांश बदलावों में, आप बस तारीखों पर गणित कर सकते हैं। इस है मान लिया जाये कि एक दिनांक फ़ील्ड, तो आप सिर्फ क्वेरी शायद कर सकते हैं:

चयन अवधि = रोक - शुरू एक व्यावहारिक उदाहरण के लिए

, चलो एक मेज के साथ परेशान कर रहा बिना दो datetimes के बीच अंतर का चयन करते हैं:

का चयन कन्वर्ट (डेटाटाइम, '2008-09-17 04: 56: 45.030') - कन्वर्ट (डेटाटाइम, '2008-09-17 04: 53: 05.920')

जो "1 9 00-01-01 00:03" : 39.110 ", यह दर्शाता है कि शून्य वर्ष/महीने/दिन हैं; इन दो डेटाटाइम के बीच 3 मिनट, 39.11 सेकेंड। वहां से, आपका कोड टाइमस्पेन कर सकता है। इस मान को पार्स करें।

2

प्रयास करें:

Select Sum(
    DateDiff(
     Minute, 
     IsNull((Select Start where Start != '9999.12.31'), GetDate()), 
     IsNull((Select End where End != '9999.12.31'), GetDate()) 
    ) 
) 
from *tableName* 
1

निम्नलिखित एसक्यूएल सर्वर के लिए काम करेंगे, अन्य डेटाबेस तिथि गणना और वर्तमान समय प्राप्त करने के लिए विभिन्न कार्यों का उपयोग करें।

Select Case When (Stop <> '31 Dec 9999') Then 
      DateDiff(mi, Start, Stop) 
     Else 
      DateDiff(mi, Start, GetDate()) 
     End 
From ATable 
0

ए जे के answer से मदद का उपयोग करना, BelowNinety के answer और Nerdfest के answer, मैं आया निम्नलिखित के साथ:

Select Sum(
    Case When End = '12/31/9999 12:00:00 AM' Then 
     DateDiff(mi, Start, Getdate()) 
    Else 
     DateDiff(mi, Start, End) 
    End) As ElapsedTime 
From Table 

मदद के लिए धन्यवाद!

3

मुझे लगता है कि यह क्लीनर है:

SELECT SUM(
       DATEDIFF(mi, Start, ISNULL(NULLIF(Stop,'99991231'), GetDate())) 
      ) AS ElapsedTime 
    FROM Table 
संबंधित मुद्दे