इसका उत्तर देने के लिए कि आपको सोमवार क्यों मिल रहा है न कि रविवार:
आप दिनांक 0 में कई सप्ताह जोड़ रहे हैं। दिनांक 0 क्या है? 1900-01-01। 1900-01-01 को कौन सा दिन था? सोमवार। तो आपके कोड में आप कह रहे हैं, सोमवार, 1 जनवरी, 1900 से कितने सप्ताह बीत चुके हैं? चलो इसे [एन] कहते हैं। ठीक है, अब [n] सप्ताहों को सोमवार, जनवरी 1, 19000 में जोड़ दें। आपको आश्चर्य नहीं होना चाहिए कि यह सोमवार है। 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
यदि वांछित हो तो मैं अपने परीक्षणों का विवरण रिले कर सकता हूं - यहां रुकना क्योंकि यह पहले से ही काफी लंबा-चौड़ा हो रहा है। गणना और इनलाइन कोड की संख्या को देखते हुए, कर्ट को उच्च अंत में सबसे तेज के रूप में देखकर मैं थोड़ा आश्चर्यचकित था। हो सकता है कि मैं इसके बारे में कुछ और गहन परीक्षण और ब्लॉग चलाऊंगा ... अगर आप लोगों को मेरे कार्यों को कहीं और प्रकाशित करने में कोई आपत्ति नहीं है।