मैं समय डेटा प्रकार में मिनट कैसे जोड़ूं?


10

मेरे पास एक संग्रहीत कार्यविधि है जो एक तालिका में दो अभिलेख सम्मिलित करती है, अभिलेखों के बीच का अंतर यह है कि दूसरे रिकॉर्ड का समय स्तंभ @MinToAddपहले की तरह है:

CREATE PROCEDURE CreateEntry
    /*Other columns*/
    @StartTime time(2),
    @EndTime time(2),
    @MinutesToAdd smallint
    AS
BEGIN
    SET NOCOUNT ON;

    SET @MinutesToAdd = @MinutesToAdd % 1440;   --Prevent overflow if needed?
    IF (@MinutesToAdd > 0)
    BEGIN
    INSERT INTO ClientNotification (/*Other columns*/ startTime, endTime)
        OUTPUT inserted.id
        VALUES
               (/*Other columns*/ @StartTime, @EndTime),
               (/*Other columns*/ @StartTime + @MinutesToAdd, @EndTime + @MinutesToAdd);
    END
    ELSE
    BEGIN
        /*Whatever ELSE does.*/
    END
END

और @MinutesToAddमिनट जोड़ने का सही तरीका क्या है ? कृपया ध्यान दें कि मैं डेटा प्रकार का उपयोग कर रहा हूं ।@StartTime@EndTime
time

अद्यतन :
एक सही उत्तर में निम्नलिखित जानकारी होनी चाहिए:

  • timeडेटा प्रकार में मिनट कैसे जोड़ें ।
  • यह प्रस्तावित समाधान परिशुद्धता के नुकसान में परिणाम नहीं करता है।
  • ईवेंट्स या चिंताओं के बारे में इस घटना से अवगत होना चाहिए कि एक timeचर में फिट होने के लिए मिनट बहुत बड़े होंगे , या चर को रोल करने का जोखिम timeहोगा। अगर कोई समस्या नहीं है तो कृपया राज्य करें।

5
मैं यह नहीं देखता कि आपके प्रश्न के लिए आपका संपादन आगे कैसे प्रश्न को स्पष्ट करता है।
स्वैसेक

@swasheck मैं स्पष्ट रूप से उन तीन चीज़ों के बारे में बताता हूँ, जिनकी मुझे तलाश है। मैं उस सीमा को भी निर्धारित करता हूं जो मैं नहीं खोज रहा हूं।
ट्रिस्ड

जवाबों:


36

आप नए प्रकारों के साथ आलसी शॉर्टहैंड अंकगणित का उपयोग नहीं कर सकते। प्रयत्न:

DATEADD(MINUTE, @MinutesToAdd, @StartTime)

ध्यान दें कि भले ही आपने अपने @MinutesToAddअतिप्रवाह से रक्षा की है , लेकिन आपने परिणाम को अतिप्रवाह से संरक्षित नहीं किया है। हालांकि, यह एक त्रुटि उत्पन्न नहीं करता है, बस वह परिणाम नहीं हो सकता है जिसकी आप अपेक्षा कर रहे हैं।

DECLARE @StartTime TIME(0) = '23:59';
DECLARE @MinutesToAdd INT = 20;

SELECT DATEADD(MINUTE, @MinutesToAdd, @StartTime);

परिणाम:

00:19:00

मुझे लगता है कि यह किसी प्रकार के आंतरिक रूपांतरण के माध्यम से जाना चाहिए, क्योंकि आप यह कहकर परिणाम प्राप्त नहीं कर सकते:

DECLARE @StartTime TIME(0) = '24:19';

परिणाम:

Msg 241, स्तर 16, राज्य 1, पंक्ति 1
रूपांतरण दिनांक और / या वर्ण स्ट्रिंग से समय परिवर्तित करते समय विफल रहा।

आप कैसे गणना हैंडल करना चाहते हैं आप विचार करने की जरूरत है कि करने के लिए नेतृत्व या तो @EndTimeया दोनों @StartTimeऔर @EndTimeअगले दिन में किया जाना है।

इसके अलावा - अपने "आदर्श उत्तर" में एक और नई आवश्यकता को संबोधित करने के लिए - सटीक का कोई नुकसान नहीं है। प्रलेखन के अनुसार , वापसी प्रकार DATEADDइनपुट के समान है:

स्ट्रिंग डेटा को छोड़कर, रिटर्न डेटा प्रकार डेट तर्क का डेटा प्रकार है।

इसलिए, TIMEमें, TIMEबाहर।


1
+1 @Aaron वैकल्पिक रूप से आप StartTime और TimeToAdd को डेटाइम में बदल सकते हैं और फिर जोड़ सकते हैं। TimeToAdd को परिवर्तित करना मिनट्स> 59 होने पर बहुत गड़बड़ हो जाएगा। DATEADD सबसे अच्छा समाधान है।
ब्रायन

यदि आप उस DATEADDतर्क को उसी प्रकार जोड़ते हैं जैसे तारीख तर्क के रूप में तो मैं स्वीकार करूंगा। "जरूरत पड़ने पर अतिप्रवाह रोकें?" लाइन की जरूरत नहीं है। रोल ओवर इश्यू को डेटा के स्रोत और डेटा के गंतव्य द्वारा नियंत्रित किया जाएगा।
ट्रिस्ड किया

3
@ निश्चित रूप से, यदि आप इस प्रश्न को जोड़ते हैं कि आपने DATEADD को उचित नहीं समझा क्योंकि आपको लगा कि यह केवल DATETIME वापस कर सकता है और इससे समस्याएँ हो सकती हैं। अन्यथा यह आपके प्रश्न के लिए या भविष्य के पाठकों के लिए प्रासंगिक नहीं लगता है ...
हारून बर्ट्रेंड

"कृपया ध्यान दें कि मैं समय डेटा प्रकार का उपयोग कर रहा हूं।" इसके अलावा, आपने मेरे प्रश्न को रिकॉर्ड के बजाय अनजाने में पंक्ति का उपयोग करने के लिए क्यों बदल दिया?
ट्रिस्पेड

1
@ संपादित संपादित बेहतर शब्दावली का उपयोग करता है और कृपया संपादन को देखें -लेट्स में आगे और पीछे नहीं है या मैं प्रश्न को बंद कर दूंगा। हारून सही है कि हमें दूसरों के लिए सब कुछ स्पष्ट करने की आवश्यकता है, आपके पास आपका जवाब है। कृपया अपने प्रश्न को संपादित करने के लिए उन पंक्तियों के साथ विचार करें जो वह सुझाव देता है कि क्या आपको लगता है कि यह मददगार होगा: हारून ने कृपया अपने जवाब में जो जानकारी आप चाहते हैं उसे जोड़ने की पेशकश की है।
जैक का कहना है कि topanswers.xyz

0

बस '0:00' के खिलाफ पूर्णांक में अपने मिनट जोड़ने के लिए डेटाडाउन फ़ंक्शन का उपयोग करें। फिर वापस समय पर डाली।

समय के रूप में कास्ट (डेटेड (मिनट, 84, '0: 00') का चयन करें)

यहां, 84 पूर्णांक मिनट है जिसे मैं "समय" प्रकार में व्यक्त करना चाहता हूं।

मैंने कहा कि '0:00' और फिर दिनांक घटक को हटाने के लिए, मैं इसे समय प्रकार के लिए जोड़ता हूं। कोई कस्टम कोडिंग आवश्यक नहीं है।

(कोई कॉलम नाम नहीं)

01: 24: ००.००,००,०००

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