কেন আপনি সোমবার পাচ্ছেন এবং রবিবার নয় এর জবাব দিতে:
আপনি ০ তারিখে কয়েকটি সংখ্যা যুক্ত করছেন 0 তারিখটি কী? 1900-01-01। 1900-01-01 দিনটি কি ছিল? সোমবার। সুতরাং আপনার কোডে আপনি বলছেন, সোমবার, জানুয়ারী, 1900 থেকে কত সপ্তাহ কেটে গেছে? আসুন যে কল [এন]। ঠিক আছে, এখন [n] সপ্তাহগুলিতে সোমবার, জানুয়ারী 1, 1900 যোগ করুন You এটি অবধি সোমবার হওয়ার মতো অবাক হবেন না। DATEADD
আপনি সপ্তাহ যোগ করতে চান এমন কোনও ধারণা নেই তবে কেবল আপনি রবিবারে পৌঁছানো অবধি কেবল just দিন যোগ করুন, তারপরে আরও days দিন যুক্ত করুন ... ঠিক যেমনটি DATEDIFF
কেবল অতিক্রম করা সীমানা চিহ্নিত করে। উদাহরণস্বরূপ, এই উভয়ই 1 ফেরত দেয়, যদিও কিছু লোক অভিযোগ করে যে, কিছুটা বুদ্ধিমান যুক্তি তৈরি করা উচিত যা চারদিকে বা নিচে নেমে যেতে হবে:
SELECT DATEDIFF(YEAR, '2010-01-01', '2011-12-31');
SELECT DATEDIFF(YEAR, '2010-12-31', '2011-01-01');
রবিবার কীভাবে পাবেন তার উত্তর দিতে:
আপনি যদি রবিবার চান, তবে একটি বেস তারিখটি চয়ন করুন যা সোমবার নয় বরং একটি রবিবার। উদাহরণ স্বরূপ:
DECLARE @dt DATE = '1905-01-01';
SELECT [start_of_week] = DATEADD(WEEK, DATEDIFF(WEEK, @dt, CURRENT_TIMESTAMP), @dt);
আপনি যদি আপনার DATEFIRST
সেটিংটি পরিবর্তন করেন (বা আপনার কোডটি একটি ভিন্ন সেটিং সহ কোনও ব্যবহারকারীটির জন্য চলছে) - যদি আপনি বর্তমান সেটিং নির্বিশেষে কোনও রবিবার চান তবে এই ব্যবস্থা ভঙ্গ হবে না । আপনি Jive সেই দুটি উত্তর চান, তাহলে আপনি একটি ফাংশন যা ব্যবহার করা উচিত না উপর নির্ভর করে DATEFIRST
সেটিং, যেমন
SELECT DATEADD(DAY, 1-DATEPART(WEEKDAY, CURRENT_TIMESTAMP), CURRENT_TIMESTAMP);
সুতরাং আপনি যদি DATEFIRST
সোমবার, মঙ্গলবার আপনার সেটিং পরিবর্তন করেন তবে আপনার কী আছে, আচরণটি পরিবর্তিত হবে। আপনি কোন আচরণটি চান তার উপর নির্ভর করে আপনি এই ফাংশনগুলির একটি ব্যবহার করতে পারেন:
CREATE FUNCTION dbo.StartOfWeek1
(
@d DATE
)
RETURNS DATE
AS
BEGIN
RETURN (SELECT DATEADD(WEEK, DATEDIFF(WEEK, '19050101', @d), '19050101'));
END
GO
... বা ...
CREATE FUNCTION dbo.StartOfWeek2
(
@d DATE
)
RETURNS DATE
AS
BEGIN
RETURN (SELECT DATEADD(DAY, 1-DATEPART(WEEKDAY, @d), @d));
END
GO
এখন, আপনার কাছে প্রচুর বিকল্প রয়েছে, তবে কোনটি সবচেয়ে ভাল করে? কোনও বড় পার্থক্য থাকলে আমি অবাক হব তবে আমি এখন পর্যন্ত প্রদত্ত সমস্ত উত্তর সংগ্রহ করেছি এবং দুটি সেট পরীক্ষার মধ্য দিয়ে চালিয়েছি - একটি সস্তা এবং একটি ব্যয়বহুল। আমি ক্লায়েন্টের পরিসংখ্যান পরিমাপ করেছি কারণ আমি এখানে পারফরম্যান্সে আই / ও বা মেমরির কোনও অংশ খেলতে দেখছি না (যদিও ফাংশনটি কীভাবে ব্যবহৃত হয় তার উপর নির্ভর করে সেগুলি খেলতে আসতে পারে)। আমার পরীক্ষায় ফলাফলগুলি হ'ল:
"সস্তা" অ্যাসাইনমেন্ট কোয়েরি:
Function - client processing time / wait time on server replies / total exec time
Gandarez - 330/2029/2359 - 0:23.6
me datefirst - 329/2123/2452 - 0:24.5
me Sunday - 357/2158/2515 - 0:25.2
trailmax - 364/2160/2524 - 0:25.2
Curt - 424/2202/2626 - 0:26.3
"ব্যয়বহুল" অ্যাসাইনমেন্ট কোয়েরি:
Function - client processing time / wait time on server replies / total exec time
Curt - 1003/134158/135054 - 2:15
Gandarez - 957/142919/143876 - 2:24
me Sunday - 932/166817/165885 - 2:47
me datefirst - 939/171698/172637 - 2:53
trailmax - 958/173174/174132 - 2:54
আমি চাইলে আমার পরীক্ষাগুলির বিবরণ রিলে করতে পারি - এটি ইতিমধ্যে বেশ দীর্ঘ-বায়ুযুক্ত হওয়ায় এখানে থামছে। গণনার সংখ্যা এবং ইনলাইন কোডের ভিত্তিতে কর্টের উচ্চতমতম হিসাবে দ্রুততম হিসাবে বেরিয়ে এসে আমি কিছুটা অবাক হয়েছিলাম। সম্ভবত আমি এটি সম্পর্কে আরও কিছু নিখুঁত পরীক্ষা এবং ব্লগ চালাব ... আপনারা যদি লোকেরা অন্য কোনও জায়গায় আপনার ক্রিয়াকলাপ প্রকাশের বিষয়ে আমার আপত্তি না করেন।
(@@DATEFIRST + DATEPART(DW, @SomeDate)) % 7
@@datefirst
আমি মনে করি নির্বিশেষে স্থির থাকে । সোমবার = ২ সহ