Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में सप्ताह का पहला दिन प्राप्त करें

इसका उत्तर देने के लिए कि आपको सोमवार क्यों मिल रहा है न कि रविवार:

आप दिनांक 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

यदि वांछित हो तो मैं अपने परीक्षणों का विवरण रिले कर सकता हूं - यहां रुकना क्योंकि यह पहले से ही काफी लंबा-चौड़ा हो रहा है। गणना और इनलाइन कोड की संख्या को देखते हुए, कर्ट को उच्च अंत में सबसे तेज के रूप में देखकर मैं थोड़ा आश्चर्यचकित था। हो सकता है कि मैं इसके बारे में कुछ और गहन परीक्षण और ब्लॉग चलाऊंगा ... अगर आप लोगों को मेरे कार्यों को कहीं और प्रकाशित करने में कोई आपत्ति नहीं है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MDF फ़ाइल खोलने में समस्या क्योंकि यह SQL त्रुटि 5171 कहती है? - आंद्रे विलियम्स द्वारा एक अतिथि पोस्ट

  2. कैसे ठीक करें:"SQLServerAgent वर्तमान में नहीं चल रहा है ..."

  3. PHP FreeTDS एक्सटेंशन का उपयोग करके MSSQL सर्वर से UTF-8 वर्णसेट के साथ डेटा प्राप्त करना

  4. SQL सर्वर डेटाबेस में सभी विदेशी कुंजी बाधाओं को कैसे निष्क्रिय करें - SQL सर्वर / TSQL ट्यूटोरियल भाग 77

  5. SQL सर्वर में "पंक्ति संस्करण" क्या है?