2010-09-20 11 views
5

इसने मुझे थोड़ी देर के लिए खराब कर दिया है। हाल ही में कुछ साल पहले मैंने एक ग्राहक के लिए कुछ कोड की समीक्षा करते समय लिखा था कि समस्या के बारे में और अधिक सुरुचिपूर्ण समाधान है या नहीं।एसक्यूएल सर्वर 2005, जन्म तिथि से आने वाले जन्मदिनों की गणना

ग्राहक दुकानों जन्म (तारीख समय क्षेत्र)

की तारीख सहित अपने ग्राहकों की सभी जानकारी वे एक उद्धरण हर सोमवार है कि किसी भी ग्राहक जिसका जन्मदिन के बाद सप्ताह के भीतर गिर जाएगी को पुन: प्राप्त चलाते हैं।

आईई। अगर निकास सोमवार 1 जनवरी को चलाया गया था, तो ग्राहक जिसका जन्मदिन सोमवार 8 जनवरी - (रविवार सहित) के बीच गिर गया -> रविवार 14 जनवरी को पुनर्प्राप्त किया जाएगा।

मेरा समाधान डेटपर्ट (डीई) फ़ंक्शन का उपयोग करना था और वर्ष के दिन परिवर्तित होने वाले ग्राहकों की जन्म तिथि के आधार पर आने वाले सभी जन्मदिनों की गणना करना था, जिसमें एक वर्ष के अंत में निकालने के लिए कुछ तर्क शामिल करना शामिल था। समस्या यह थी कि वर्ष का दिन 1 दिन तक परिणाम फेंक देता है यदि ग्राहक लीप वर्ष में पैदा हुआ था और/या निकास 2 9 फरवरी के बाद लीप-वर्ष पर चलाया जाता है, तो एक बार फिर मुझे और जोड़ना पड़ा तर्क इसलिए प्रक्रिया ने अपेक्षित परिणामों को वापस कर दिया।

यह एक साधारण कार्य के लिए काफी अधिक मारने लग रहा था, सरलता के लिए मान लें कि तालिका 'ग्राहक' में 4 फ़ील्ड, पहला नाम, अंतिम नाम, डॉब और पता शामिल है।

यह कैसे सरल करने के लिए पर कोई सुझाव वास्तव में

सराहना

वेस

किया जाएगा

उत्तर

4

क्या आपके लिए यह काम अच्छा लगेगा?

select * from Customers c 
where dateadd(year, 1900-year(dob), dob) 
    between dateadd(year, 1900-year(getdate()), getdate()) 
    and dateadd(year, 1900-year(getdate()), getdate())+7 
+1

बेशक! मुझे अब दिख गया। आपकी व्याख्या के लिए बहुत बहुत धन्यवाद। यह अब इतना स्पष्ट प्रतीत होता है कि मैं समझता हूं कि यह कैसे काम करता है! एक बार जब आप कुछ याद करने में फंस जाते हैं तो आप स्पष्ट याद करते हैं। बहुत धन्यवाद। –

+1

ओह आओ, यह एसओ की शक्ति है! आप जानते हैं, चीजों को समझना। –

+0

मैं 30 दिनों के साथ इस विधि का उपयोग कर रहा था और मैंने पाया कि यह साल के इस समय (15 दिसंबर) काम नहीं करता है। यहां जवाब देखें: http://stackoverflow.com/questions/83531/sql-select- आगामी- जन्मदिन – Warren

3

क्यों नहीं इस साल के जन्मदिन पर DatePart (सप्ताह) का उपयोग करें?

SET DATEFIRST 1 -- Set first day of week to monday 
SELECT * FROM customer 
WHERE DATEPART(wk, DATEADD(yy, DATEPART(yy, GETDATE()) - DATEPART(yy, customer.dob), customer.dob)) = DATEPART(wk, GETDATE()) + 1 

यह उन सभी ग्राहकों का चयन करता है जो जन्मदिन का सप्ताहांत वर्तमान सप्ताह संख्या से अधिक है।

+0

मैं इस समाधान चाहते सहित आगामी जन्मदिन मिल जाएगा ... लेकिन अगर हम सोमवार से शुरू नहीं है, लेकिन गुरुवार तक। ओह, मैं देखता हूं ... :) –

+1

1. एमएस 'SETDATE FIRST 1' के अनुसार रविवार सोमवार – Unreason

+2

@Unreason: नहीं, यह सोमवार है। Http://msdn.microsoft.com/en-us/library/ms181598.aspx – Carvellis

2

मुझे लगता है कि DATEADD उचित चीज़ करना चाहिए।

+0

मुझे नहीं लगता कि आप डेटएड का उपयोग कैसे करेंगे। ग्राहक डीओबी अलग-अलग है .. यानी 04/01/1965, 02/06/1982 इत्यादि .. –

+0

@Wes मूल्य, मेरा उत्तर देखें। –

1
YEAR(GETDATE() - dbo.Patients.Dob) - 1900 

मैं सुरक्षित रूप से ग्रहण कर सकते हैं इससे पहले कि आप 1900

+3

[आप कर सकते हैं] (http://en.wikipedia.org/wiki/Oldest_people#Ten_verified_oldest_people_living)? – fredley

+0

मुझे पता है कि यह पोस्ट पुराना है, लेकिन मैं टॉम से सहमत हूं। – RoLYroLLs

1

का जन्म कृपया प्रयास करें यह एक ग्राहक हैं कभी नहीं होगा।

SELECT TOP 10 BirthDate, FirstName 
FROM Customers 
WHERE DATEPART(mm,BirthDate) >= DATEPART(mm,GETDATE()) 
AND DATEPART(day,BirthDate) >= DATEPART(day,getdate()) 
OR DATEPART(mm,BirthDate) > DATEPART(mm,getdate()) 
ORDER BY DatePart(mm,BirthDate),DatePart(day,BirthDate) 

इस क्वेरी आज ही

संबंधित मुद्दे