সাম্প্রতিক প্রকল্পের একটি প্রয়োজনীয়তাটি ছিল কখন কোনও সংস্থান সম্পূর্ণরূপে গ্রাস হবে তা রিপোর্ট করা। পাশাপাশি ক্লান্তিকর ক্যালেন্ডারের তারিখের সাথে আমাকে বাকি সময় ইংরাজির মতো ফর্ম্যাটে প্রদর্শন করতে বলা হয়েছিল, "1 বছর, 3 মাস যেতে হবে" এর মতো কিছু।
অন্তর্নির্মিত DATEDIFF
ফাংশন
সুনির্দিষ্ট স্টার্টেট এবং শেষের মধ্যে পার হয়ে নির্দিষ্ট তারিখের পার্টের সীমানার গণনা ফিরিয়ে দেয় ...
যদি হিসাবে হয় তবে এটি বিভ্রান্তিকর বা বিভ্রান্তিকর ফলাফল আনতে পারে। উদাহরণস্বরূপ, YEAR এর ব্যবধান ব্যবহার করে 1999-12-31 (YYYY-MM-DD) এবং 2000-01-01 কে এক বছর আলাদা করা হবে যদিও সাধারণ জ্ঞান বলবে যে এই তারিখগুলি কেবল 1 দিনের দ্বারা পৃথক করা হবে। বিপরীতে DAY 1999-12-31 এবং 2010-12-31 এর বিরতি ব্যবহার করে 4,018 দিন দ্বারা পৃথক করা হয় যখন বেশিরভাগ লোক "11 বছর" আরও ভাল বর্ণনার হিসাবে দেখতে পাবে।
দিনের সংখ্যা থেকে শুরু করে এবং সেখান থেকে কয়েক মাস এবং বছর গণনা করা লাফ বছর এবং আকারের মাসের ত্রুটিযুক্ত হতে পারে।
আমি ভাবছিলাম যে এটি কীভাবে বিভিন্ন এসকিউএল উপভাষায় প্রয়োগ করা যেতে পারে? উদাহরণ আউটপুট অন্তর্ভুক্ত:
create table TestData(
FromDate date not null,
ToDate date not null,
ExpectedResult varchar(100) not null); -- exact formatting is unimportant
insert TestData (FromDate, ToDate, ExpectedResult)
values ('1999-12-31', '1999-12-31', '0 days'),
('1999-12-31', '2000-01-01', '1 day'),
('2000-01-01', '2000-02-01', '1 month'),
('2000-02-01', '2000-03-01', '1 month'), -- month length not important
('2000-01-28', '2000-02-29', '1 month, 1 day'), -- leap years to be accounted for
('2000-01-01', '2000-12-31', '11 months, 30 days'),
('2000-02-28', '2000-03-01', '2 days'),
('2001-02-28', '2001-03-01', '1 day'), -- not a leap year
('2000-01-01', '2001-01-01', '1 year'),
('2000-01-01', '2011-01-01', '11 years'),
('9999-12-30', '9999-12-31', '1 day'), -- catch overflow in date calculations
('1900-01-01', '9999-12-31', '8099 years 11 months 30 days'); -- min(date) to max(date)
আমি এসকিউএল সার্ভার 2008R2 ব্যবহার করে যাচ্ছি তবে অন্যান্য উপভাষাগুলি কীভাবে এটি পরিচালনা করবে তা জানতে আগ্রহী।