একটি টাইম ডেটা টাইপের সাথে আমি কীভাবে মিনিট যুক্ত করব?


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
আপনার প্রশ্নের আপনার সম্পাদনা কীভাবে প্রশ্নটিকে আরও স্পষ্ট করে তা আমি দেখতে পাচ্ছি না।
সোয়াশেক

@ সোয়াশেক আমি যে তিনটি জিনিস খুঁজছি তা স্পষ্টভাবে জানিয়েছি। আমি যা খুঁজছি না তারও সীমানা নির্ধারণ করেছি।
Trisped

উত্তর:


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 @ অ্যারোন বিকল্পভাবে আপনি স্টার্টটাইম এবং টাইমটোএডডকে ডেটটাইমে রূপান্তর করতে পারেন এবং তারপরে যুক্ত করতে পারেন। টাইমটো এড যুক্ত করে মিনিট> 59 এ চলে যাওয়া খুব অগোছালো হয়ে যাবে D
ব্রায়ান

যদি আপনি DATEADDসেই তারিখ যুক্তি হিসাবে একই ধরণের ফেরত যোগ করেন তবে আমি গ্রহণ করব। "প্রয়োজনে ওভারফ্লো রোধ করবেন?" লাইন প্রয়োজন হয় না। রোল ওভার ইস্যুটি ডেটার উত্স এবং ডেটার গন্তব্য দ্বারা পরিচালিত হবে।
19.445

3
@ ট্রাইপড নিশ্চিত, আপনি যদি এই প্রশ্নটি যুক্ত করেন যে আপনি DATEADD যথাযথ বলে মনে করেন নি কারণ আপনি ভেবেছিলেন এটি কেবলমাত্র DATETIME ফেরত পারে এবং এটি সমস্যার কারণ হতে পারে। অন্যথায় এটি আপনার প্রশ্নের সাথে বা ভবিষ্যতের পাঠকদের কাছে প্রাসঙ্গিক বলে মনে হচ্ছে না ...
অ্যারন বারট্র্যান্ড

"দয়া করে নোট করুন যে আমি টাইম ডেটা টাইপ ব্যবহার করছি" দ্বারা প্রাসঙ্গিকতা কীভাবে বোঝানো হয়নি? এছাড়াও, আপনি কেন আমার প্রশ্নটিকে রেকর্ডের পরিবর্তে অনিচ্ছাকৃতভাবে সারি ব্যবহার করতে পরিবর্তন করেছিলেন?
ট্রিপড

1
@ সম্পাদিত ট্রাইপড এডিট আরও ভাল পরিভাষা ব্যবহার করে এবং দয়া করে এডিটিং-এ প্রায়শই জিজ্ঞাসা করুন দেখুন —লেটগুলিতে আর পিছনে নেই এবং আমি প্রশ্নটি লক করব। হারুন ঠিক বলেছেন যে আমাদের অন্যদের জন্য সমস্ত কিছু পরিষ্কার করা দরকার, আপনার উত্তর আছে। আপনার পরামর্শটি সেই লাইনের সাথে সম্পাদনা করে বিবেচনা করুন যা আপনি মনে করেন যে এটি সহায়ক হবে: আপনি যদি তা করেন তবে হারুন তার উত্তরটিতে আপনি যে তথ্য চান তা যুক্ত করার জন্য দয়া করে অফার করেছেন।
জ্যাক বলছেন টপান্সওয়ার্স.অক্সিজ

0

'0:00' এর বিপরীতে আপনার মিনিটগুলি পূর্ণ সংখ্যায় যোগ করতে ডেটএডডি ফাংশনটি কেবল ব্যবহার করুন। তারপরে সময়মতো কাস্ট করুন।

কাস্ট নির্বাচন করুন (তারিখের সাথে যুক্ত (মিনিট, 84, '0: 00') সময় হিসাবে)

এখানে, 84 হল পূর্ণসংখ্যার মিনিট যা আমি "সময়" টাইপে প্রকাশ করতে চাই।

আমি এটিকে '0:00' এ যুক্ত করেছি এবং তারপরে তারিখের উপাদানটি সরিয়ে ফেলতে, আমি এটি টাইপ টাইপ করি cas কোনও কাস্টম কোডিং প্রয়োজন নেই।

(কোনও কলামের নাম নেই)

01: 24: 00,0000000

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.