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

DATEDIFF के लिए एक समाधान () SQL सर्वर में SET DATEFIRST को अनदेखा करना (T-SQL उदाहरण)

DATEDIFF() के बारे में एक दिलचस्प बात SQL सर्वर में कार्य यह है कि यह आपके SET DATEFIRST . पर ध्यान नहीं देता है मूल्य।

हालाँकि, यह कोई बग नहीं है। DATEDIFF() के लिए Microsoft का दस्तावेज़ीकरण स्पष्ट रूप से निम्नलिखित बताता है:

<ब्लॉककोट>

निर्दिष्ट करना SET DATEFIRST DATEDIFF . पर कोई प्रभाव नहीं पड़ता है . DATEDIFF यह सुनिश्चित करने के लिए कि फ़ंक्शन नियतात्मक तरीके से संचालित होता है, हमेशा रविवार को सप्ताह के पहले दिन के रूप में उपयोग करता है।

यदि आप नहीं जानते हैं, तो SET DATEFIRST आपके सत्र के लिए सप्ताह का पहला दिन निर्धारित करता है। यह 1 से 7 तक की एक संख्या है (जो सोमवार से रविवार तक मेल खाती है)।

SET DATEFIRST . के लिए प्रारंभिक मान परोक्ष रूप से भाषा सेटिंग द्वारा निर्धारित किया जाता है (जिसे आप SET LANGUAGE . के साथ सेट कर सकते हैं बयान)। वास्तविक मान सेट की गई भाषा पर निर्भर करेगा। उदाहरण के लिए us_english . के लिए डिफ़ॉल्ट मान भाषा है 7 (रविवार), जबकि British . के लिए डिफ़ॉल्ट भाषा है 1 (सोमवार)।

हालांकि, आप SET DATEFIRST . का उपयोग कर सकते हैं इसे ओवरराइड करने के लिए कथन ताकि आप सप्ताह के पहले दिन के लिए एक अलग दिन का उपयोग करते हुए एक ही भाषा का उपयोग करना जारी रख सकें।

लेकिन जैसा कि बताया गया है, SET DATEFIRST मान का DATEDIFF() . पर कोई प्रभाव नहीं पड़ता है समारोह। DATEDIFF() फ़ंक्शन हमेशा मानता है कि रविवार सप्ताह का पहला दिन है, भले ही आपका SET DATEFIRST मूल्य।

DATEDIFF() . का उपयोग करते समय यह कुछ दिलचस्प समस्याएं पैदा कर सकता है अगर आप नहीं जानते कि यह कैसे काम करता है।

अगर आप खुद को इस स्थिति में पाते हैं, तो उम्मीद है कि इस पेज पर दिए गए उदाहरण मदद कर सकते हैं।

उदाहरण 1 - समस्या

सबसे पहले, यहाँ वास्तविक समस्या का एक उदाहरण है। ध्यान दें कि हम SET DATEFIRST . को पुनः प्राप्त कर सकते हैं @@DATEFIRST . का चयन करके मान ।

DECLARE 
  @startdate date = '2025-01-05', 
  @enddate date = '2025-01-06';

SET LANGUAGE us_english;
SELECT 
  @@DATEFIRST AS 'SET DATEFIRST Value', 
  DATEDIFF(week, @startdate, @enddate) AS 'us_english DATEDIFF() Result';

SET LANGUAGE British;
SELECT 
  @@DATEFIRST AS 'SET DATEFIRST Value', 
  DATEDIFF(week, @startdate, @enddate) AS 'British DATEDIFF() Result';

परिणाम:

+-----------------------+--------------------------------+
| SET DATEFIRST Value   | us_english DATEDIFF() Result   |
|-----------------------+--------------------------------|
| 7                     | 0                              |
+-----------------------+--------------------------------+

+-----------------------+-----------------------------+
| SET DATEFIRST Value   | British DATEDIFF() Result   |
|-----------------------+-----------------------------|
| 1                     | 0                           |
+-----------------------+-----------------------------+

इस मामले में, पहली तारीख रविवार को और दूसरी तारीख सोमवार को पड़ती है। इसलिए आप आमतौर पर ब्रिटिश DATEDIFF() . की अपेक्षा करेंगे 1 return लौटाने का परिणाम . आप इसकी अपेक्षा करेंगे क्योंकि रविवार से सोमवार तक सप्ताह-भाग की सीमा पार हो जाती है (क्योंकि SET DATEFIRST मान 1 है जिसका अर्थ है "सोमवार", और सोमवार एक नए सप्ताह की शुरुआत का प्रतीक है)।

लेकिन क्योंकि DATEDIFF() आपके SET DATEFIRST . पर ध्यान नहीं देता मान लेते हैं और मानते हैं कि रविवार सप्ताह की शुरुआत है, हमें दोनों भाषाओं के लिए समान परिणाम मिलते हैं।

बस यह सुनिश्चित करने के लिए, मैं फिर से क्वेरी चलाऊंगा, लेकिन इस बार मैं SET DATEFIRST सेट करूंगा मूल्य स्पष्ट रूप से . दूसरे शब्दों में, भाषा सेट करने के बजाय, मैं SET DATEFIRST . का उपयोग करूँगा कथन:

DECLARE 
  @startdate date = '2025-01-05', 
  @enddate date = '2025-01-06';

SET DATEFIRST 7;
SELECT 
  @@DATEFIRST AS 'SET DATEFIRST Value', 
  DATEDIFF(week, @startdate, @enddate) AS 'us_english DATEDIFF() Result';

SET DATEFIRST 1;
SELECT 
  @@DATEFIRST AS 'SET DATEFIRST Value', 
  DATEDIFF(week, @startdate, @enddate) AS 'British DATEDIFF() Result';

परिणाम:

+-----------------------+--------------------------------+
| SET DATEFIRST Value   | us_english DATEDIFF() Result   |
|-----------------------+--------------------------------|
| 7                     | 0                              |
+-----------------------+--------------------------------+

+-----------------------+-----------------------------+
| SET DATEFIRST Value   | British DATEDIFF() Result   |
|-----------------------+-----------------------------|
| 1                     | 0                           |
+-----------------------+-----------------------------+

वही परिणाम, तब भी जब आप स्पष्ट रूप से SET DATEFIRST . सेट करते हैं मूल्य। हालांकि यह कोई आश्चर्य की बात नहीं है - मुझे आश्चर्य होगा अगर यह नहीं एक ही परिणाम लौटाएं।

साथ ही, यह केवल इस बात की पुष्टि करता है कि DATEDIFF() ठीक वैसे ही काम कर रहा है जैसा इरादा था।

तो, हम इसे कैसे बदल सकते हैं ताकि हमारा DATEDIFF() परिणाम हमारे SET DATEFIRST . का सम्मान करते हैं मूल्य?

समाधान

यहां एक समाधान/समाधान है जो आपको इच्छित परिणाम प्राप्त करने की अनुमति देगा। यह सुनिश्चित करेगा कि आपका SET DATEFIRST सेटिंग्स को आपके DATEDIFF() . में विभाजित किया जाता है परिणाम।

आपको बस @@DATEFIRST घटाना है इनपुट तिथियों से।

DECLARE 
  @startdate date = '2025-01-05', 
  @enddate date = '2025-01-06';

SET DATEFIRST 7;
SELECT 
  @@DATEFIRST AS 'SET DATEFIRST Value', 
  DATEDIFF(week, DATEADD(day, [email protected]@DATEFIRST, @startdate), DATEADD(day, [email protected]@DATEFIRST, @enddate)) AS 'us_english DATEDIFF() Result';

SET DATEFIRST 1;
SELECT 
  @@DATEFIRST AS 'SET DATEFIRST Value', 
  DATEDIFF(week, DATEADD(day, [email protected]@DATEFIRST, @startdate), DATEADD(day, [email protected]@DATEFIRST, @enddate)) AS 'British DATEDIFF() Result';

परिणाम:

+-----------------------+--------------------------------+
| SET DATEFIRST Value   | us_english DATEDIFF() Result   |
|-----------------------+--------------------------------|
| 7                     | 0                              |
+-----------------------+--------------------------------+

+-----------------------+-----------------------------+
| SET DATEFIRST Value   | British DATEDIFF() Result   |
|-----------------------+-----------------------------|
| 1                     | 1                           |
+-----------------------+-----------------------------+

यह DATEADD() . का उपयोग करता है @@DATEFIRST . की मात्रा से इनपुट तिथियों को कम करने के लिए कार्य करता है (जो आपका SET DATEFIRST है मूल्य)।

इस मामले में DATEDIFF() फ़ंक्शन अभी भी सप्ताह के पहले दिन के रूप में रविवार का उपयोग करता है, हालांकि, गणना में उपयोग की जाने वाली वास्तविक तिथियां अलग हैं। @@DATEFIRST . की राशि से उन्हें समय पर वापस ले जाया गया है .

निम्नलिखित उदाहरण उन तिथियों को दर्शाता है जिनका उपयोग गणना में किया गया था:

DECLARE 
  @startdate date = '2025-01-05', 
  @enddate date = '2025-01-06';

SET DATEFIRST 7;
SELECT 
  @startdate AS 'Original Date', 
  @@DATEFIRST AS 'Subtract By',
  DATEADD(day, [email protected]@DATEFIRST, @startdate) AS 'Resulting Date'
UNION ALL
SELECT 
  @enddate, 
  @@DATEFIRST,
  DATEADD(day, [email protected]@DATEFIRST, @enddate);  

SET DATEFIRST 1;
SELECT 
  @startdate AS 'Original Date', 
  @@DATEFIRST AS 'Subtract By',
  DATEADD(day, [email protected]@DATEFIRST, @startdate) AS 'Resulting Date'
UNION ALL
SELECT 
  @enddate, 
  @@DATEFIRST,
  DATEADD(day, [email protected]@DATEFIRST, @enddate);  

परिणाम:

+-----------------+---------------+------------------+
| Original Date   | Subtract By   | Resulting Date   |
|-----------------+---------------+------------------|
| 2025-01-05      | 7             | 2024-12-29       |
| 2025-01-06      | 7             | 2024-12-30       |
+-----------------+---------------+------------------+

+-----------------+---------------+------------------+
| Original Date   | Subtract By   | Resulting Date   |
|-----------------+---------------+------------------|
| 2025-01-05      | 1             | 2025-01-04       |
| 2025-01-06      | 1             | 2025-01-05       |
+-----------------+---------------+------------------+

तो हमारे समाधान में, DATEDIFF() इसकी गणना में "परिणाम तिथि" का इस्तेमाल किया।

अगर आपको DATEDIFF() के साथ समस्या हो रही है SET DATEFIRST . को नज़रअंदाज़ करना , उम्मीद है कि इस लेख ने मदद की।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में VARCHAR/CHAR के बजाय हमें NVARCHAR/NCHAR का उपयोग कब करना चाहिए?

  2. DATETIMEFROMPARTS () SQL सर्वर में उदाहरण (T-SQL)

  3. SQL सर्वर में इतिहास तालिका में ऐतिहासिक रिकॉर्ड कैसे संग्रहीत करें

  4. XML डेटा को SQL सर्वर डेटाबेस कॉलम में विभाजित करने का सबसे अच्छा तरीका

  5. एसएसआईएस फ्लैट फ़ाइल स्रोत में खराब पंक्ति को कैसे छोड़ें?