उत्तर देने के लिए कि आपको सोमवार क्यों है और रविवार नहीं है:
आप दिनांक 0 पर कई सप्ताह जोड़ रहे हैं। दिनांक 0 क्या है? 1900/01/01। 1900-01-01 को क्या दिन था? सोमवार। तो आपके कोड में आप कह रहे हैं, 1 जनवरी 1900 से लेकर सोमवार तक कितने सप्ताह बीत चुके हैं? चलो कि [n] कहते हैं। ठीक है, अब सोमवार, 1 जनवरी, 1900 को [n] सप्ताह जोड़ें। आपको आश्चर्य नहीं होना चाहिए कि यह एक सोमवार होने के नाते समाप्त होता है। DATEADD
ऐसा कोई विचार नहीं है कि आप सप्ताह जोड़ना चाहते हैं, लेकिन केवल जब तक आप रविवार तक नहीं जाते हैं, यह सिर्फ 7 दिन जोड़ रहा है, तो 7 और दिन जोड़ रहा है, ... जैसे कि 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
सेटिंग बदलते हैं (या एक अलग सेटिंग वाले उपयोगकर्ता के लिए आपका कोड चल रहा है) तो यह नहीं टूटेगा - बशर्ते कि आप अभी भी वर्तमान सेटिंग की परवाह किए बिना एक रविवार चाहते हों। यदि आप चाहते हैं कि वे दो उत्तर दें, तो आपको एक फ़ंक्शन का उपयोग करना चाहिए , जो सेटिंग पर निर्भर करता हैDATEFIRST
, जैसे
SELECT DATEADD(DAY, 1-DATEPART(WEEKDAY, CURRENT_TIMESTAMP), CURRENT_TIMESTAMP);
इसलिए यदि आप अपनी DATEFIRST
सेटिंग सोमवार, मंगलवार को बदलते हैं, तो आपके पास क्या है, व्यवहार बदल जाएगा। आप कौन सा व्यवहार चाहते हैं, इसके आधार पर, आप इनमें से किसी एक कार्य का उपयोग कर सकते हैं:
CREATE FUNCTION dbo.StartOfWeek1 -- always a Sunday
(
@d DATE
)
RETURNS DATE
AS
BEGIN
RETURN (SELECT DATEADD(WEEK, DATEDIFF(WEEK, '19050101', @d), '19050101'));
END
GO
... या ...
CREATE FUNCTION dbo.StartOfWeek2 -- always the DATEFIRST weekday
(
@d DATE
)
RETURNS DATE
AS
BEGIN
RETURN (SELECT DATEADD(DAY, 1-DATEPART(WEEKDAY, @d), @d));
END
GO
अब, आपके पास बहुत सारे विकल्प हैं, लेकिन कौन सा सबसे अच्छा प्रदर्शन करता है? मुझे आश्चर्य होगा अगर कोई बड़ा अंतर होगा लेकिन मैंने अब तक प्रदान किए गए सभी उत्तरों को एकत्र किया और उन्हें परीक्षणों के दो सेटों के माध्यम से चलाया - एक सस्ता और एक महंगा। मैंने क्लाइंट आँकड़ों को मापा क्योंकि मैं I / O या मेमोरी को यहाँ प्रदर्शन में हिस्सा नहीं देखता (हालाँकि वे फ़ंक्शन के उपयोग के आधार पर खेल में आ सकते हैं)। मेरे परीक्षणों में परिणाम हैं:
"सस्ता काम असाइनमेंट क्वेरी:
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
मुझे लगता है कि स्थापित करने के लिए लगातार परवाह किए बिना । सोमवार = 2. के साथ