এসএসকিউএল সার্ভার সপ্তাহ বনাম আইএসও সপ্তাহ


33

ঠিক আছে তাই আমার কাছে একটি প্রতিবেদন আছে যা গত সপ্তাহের তুলনায় বনাম এই সপ্তাহে করে এবং আমাদের গ্রাহক লক্ষ্য করেছেন যে তাদের ডেটা "ফানকি"। আরও তদন্তের পরে আমরা দেখতে পেলাম যে এটি আইএসও মান অনুযায়ী সপ্তাহের সঠিকভাবে করছে না। আমি এই স্ক্রিপ্টটি পরীক্ষার মামলা হিসাবে চালিয়েছি।

SET DATEFIRST 1
SELECT DATEPART(WEEK, '3/26/13')
    , DATEPART(WEEK, '3/27/12')
    , DATEPART(WEEK, '3/20/12')
    , DATEPART(WEEK, '1/2/12')
SELECT DATEPART(ISO_WEEK, '3/26/13')
    , DATEPART(ISO_WEEK, '3/27/12')
    , DATEPART(ISO_WEEK, '3/20/12')
    , DATEPART(ISO_WEEK, '1/2/12')

রান করার সময় আমি এই ফলাফলগুলি পেয়েছি।

ফলাফল সেট

আমি ভেবেছিলাম এটি অদ্ভুত এবং তাই আমি আরও কিছু খনন করেছিলাম এবং দেখেছি যে এসকিউএল সার্ভার জানুয়ারীর প্রথম সপ্তাহ হিসাবে 1 ই জানুয়ারী গণনা করে যেখানে আইএসও জানুয়ারীর প্রথম রবিবারকে বছরের প্রথম সপ্তাহ হিসাবে গণনা করে।

প্রশ্নটি তখন দুটি ভাঁজ হয়ে শেষ হয়। প্রশ্ন 1 কেন এটি? প্রশ্ন 2 এর কি কোনও উপায় আছে তাই আমি ISO_Weekসর্বত্র ব্যবহার করার জন্য আমার সমস্ত কোড সংশোধন করব না ?

উত্তর:


27

এসকিউএল সার্ভার যখন প্রথম WEEKতারিখ / অংশ প্রয়োগ করেছিল তখন ফিরে তাদের একটি পছন্দ করতে হয়েছিল। আমি মনে করি না যে এ সম্পর্কে সত্যিকার অর্থে খুব সচেতনতা ছিল, তৎকালীন সর্বাধিক সাধারণ মানের সাথে তাল মিলানো ছাড়া - মনে রাখবেন এটি এমন এক সময়ে ছিল যেখানে মানগুলির সাথে মানা করা সর্বোচ্চ অগ্রাধিকার ছিল না (অন্যথায় আমাদের মতো জিনিসগুলি না থাকত timestamp, IDENTITYএবং TOP)। তারা পরে যুক্ত করেছে ISO_WEEK(২০০৮ আমি বিশ্বাস করি) কারণ এর মধ্যে কাজটি হ'ল আপনার নিজের, ধীর, ক্রেপি স্কেলারার ইউডিএফ লিখতে - বাস্তবে তারা সত্যিই একটি খারাপ তৈরি করেছিলেন এবং এটি সরকারী ডকুমেন্টেশনে রেখেছিলেন (এটি এখনও পর্যন্ত সরানো হয়েছে) যেমন আমি বলতে পারি)।

আমি DATEPART(WEEKএটির ভান করার কোনও উপায় জানি না DATEPART(ISO_WEEK- আমি মনে করি আপনাকে কোডটি পরিবর্তন করতে হবে (এবং যদি আপনি উত্স নিয়ন্ত্রণ ব্যবহার করেন তবে এটি খুব কঠিন হওয়া উচিত নয় - আপনি এই গণনাটি কত জায়গায় করছেন? আছে) আপনি কোথাও এটি গণনা করার বিষয়ে ভেবেছিলেন যাতে আপনার কোডটি এটিকে ছাঁটাই করে না ফেলে? আপনি যেহেতু এখন কোডটি পরিবর্তন করছেন তাই এখন এটি বিবেচনা করার সময় হতে পারে ...)।

এবং আপনি যদি সত্যিই উত্তর চান তবে কেন? আমি মনে করি যে তারা কেন ডিফল্ট বেছে নিয়েছিল তা নির্ধারণ করতে আপনাকে কিছু মূল বিকাশকারীকে ধরতে হবে। আবার, আমার কাছে মনে হয় এটি সত্যিকারের "F স্ট্যান্ডার্ডগুলি নয়!" বরং পছন্দ, "কি মান?"

এখানে কিছু তথ্য রয়েছে যা কার্যকর হতে পারে:

https://stackoverflow.com/questions/348880/getting-week-number-off-a-date-in-ms-sql-server-2005

http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/iso-week-in-sql-server


প্রযুক্তিগতভাবে আমার যা করতে হবে তা হ'ল আমার ডিমক্যালেন্ডার টেবিলটি বদলাতে হবে দুর্ভাগ্যক্রমে আমাদের বিকাশকারীরা বেশ কয়েকটি প্রতিবেদনের ক্ষেত্রে এটি ব্যবহার না করার সিদ্ধান্ত নিয়েছেন তাই এটি ফ্লাইতে গণনা করা হচ্ছে। এটি মোটামুটি কৌতূহলের চেয়ে বেশি অনুশীলন ছিল এটি যে কোনও সংকটের চেয়ে বেশি।
জেন

5
আমি আপনাকে পরামর্শ দিচ্ছি যে আপনার বিকাশকারীরা কাউবয় কোডিংয়ের চেয়ে সেরা অভ্যাসগুলি অনুসরণ করার জন্য তাদের প্রতিবেদনগুলি আপডেট করুন। তবে তা কেবল আমিই।
অ্যারন বারট্র্যান্ড

1
সুসংবাদটি এক সপ্তাহেরও কম সময়ের মধ্যে রয়েছে তারা আর আমার বিকাশকারী হবে না। :)
জেন

2

বেশিরভাগ কর্তৃপক্ষ বছরের প্রথম সপ্তাহের জন্য বিভিন্ন শর্ত ধরে নিয়েছে। কিছু অনুমান করে যে সপ্তাহের প্রথম দিনটি প্রথম সপ্তাহ শুরু হয় তবে সর্বাধিক প্রচলিত ধারণাটি হ'ল প্রথম সপ্তাহে প্রথম বৃহস্পতিবারটি বছরের প্রথম সপ্তাহ হয়।

তাই ISO_WEEKগ্রহণ করে এবং 2010, 2011 বা 2012 সালে আপনি না পরীক্ষা করতে মতো যে ISO_WEEK1 লা জানুয়ারি 52nd বা 53rd সপ্তাহে বলেছেন যখন হয় WEEKবা WKবা WWবলছেন প্রথম সপ্তাহে।

SELECT DATEPART (WW,'01/01/2010')   --> 1
SELECT DATEPART (WK,'01/01/2010')   --> 1
SELECT DATEPART (WEEK,'01/01/2010')   --> 1
SELECT DATEPART (ISO_WEEK,'01/01/2010')   --> 53
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.