2010-05-20 15 views
5

में n दिनों में आने वाला है मैं सालगिरह तिथियों के साथ एक मेज है। मुझे एक प्रश्न चाहिए जो मुझे अगले 10 दिनों में आने वाली सालगिरह की पंक्तियां देता है। उदाहरण के लिए:खोज करता है, तो एक सालगिरह MySql

birthdate 
--------- 
1965-10-10 
1982-05-25 


SELECT birthdate FROM Anniversaries WHERE mystical_magical_mumbo_jumbo <= 10 

+------------+ 
| birthdate | 
+------------+ 
| 1982-05-25 | 
+------------+ 
1 row in set (0.01 sec) 

मैं प्रपत्र x <= 10 में क्वेरी रखने के लिए, क्योंकि मैं क्वेरी के अन्य भागों में है कि 10 नंबर का उपयोग करेंगे चाहते हैं, और अगर मैं इसे एक चर करने के लिए सेट, मैं बदल सकते हैं यह वैरिएबल को बदलकर हर जगह एक बार, और क्वेरी को फिर से लिखना नहीं है।

+1

आप शायद पहले से ही यह जानते हैं, लेकिन उस प्रारूप में अभिव्यक्ति को अभिव्यक्ति के बाईं तरफ एक फ़ंक्शन को मजबूर कर सकता है, जो MySQL को जन्मदिन पर इंडेक्स का उपयोग करने से रोक देगा। –

+0

क्या 'पक्षपात' मामला है? यदि यह '10 => x' रूप में है, तो क्या यह इंडेक्स का उपयोग करने की अनुमति देगा? – user151841

+1

@ user151841, आदर्श रूप में, आपके पास अभिव्यक्ति के बाईं ओर केवल कॉलम नाम होगा। इस मामले में, आप भविष्य की तारीख प्राप्त करने के लिए 10 पर एक फ़ंक्शन लागू कर सकते हैं और इस तरह कुछ ऐसा कह सकते हैं जहां जन्मदिन> = DATE_FUNCTION (10) '। अगर कोई और मुझे इससे हरा नहीं देता है, तो मैं विशिष्ट कार्य को देखूंगा और आपको जवाब दूंगा। –

उत्तर

6

दूसरों के रूप में कहा है, आप अपनी तुलना में वर्ष को अनदेखा करने की आवश्यकता है।DAYOFYEAR() फ़ंक्शन ऐसा करने का एक तरीका है।

यहां मेरे सिर के ऊपर से एक त्वरित समाधान है। यह अगले 10 दिनों में सभी जन्मदिन वापस कर देगा, भले ही दिसंबर के आखिर में और जन्मदिन अगले वर्ष हो।

यह लीप साल ठीक से संभाल नहीं करता है, इसलिए मार्च के जन्मदिन के शुरुआती दिनों में यह 1 दिन तक बंद हो जाएगा यदि यह वर्ष एक लीप वर्ष है और व्यक्ति लीप वर्ष या इसके विपरीत में पैदा नहीं हुआ था। लीप साल भी जनवरी के आखिर में दिसंबर के आखिर में एक दिन के बंद होने के कारण जनवरी के जन्मदिन का कारण बनेंगे। किसी को भी लीप वर्ष सुधार जोड़ने करना चाहता है, के लिए स्वतंत्र महसूस :)

SELECT birthdate 
FROM Anniversaries 
WHERE dayofyear(birthdate) - dayofyear(curdate()) between 0 and 10 
or dayofyear(birthdate) + 365 - dayofyear(curdate()) between 0 and 10; 
1

संदर्भ के लिए MySQL DATEDIFF

DateDiff (expr1, expr2)

DateDiff() expr1 रिटर्न का प्रयास करें इस

SELECT birthdate FROM Anniversaries 
WHERE DATEDIFF(CURTIME(),birthdate) >= 0 
AND DATEDIFF(CURTIME(),birthdate) <= 10 

चेक इस - expr2 करने के लिए एक तारीख से दिन में एक मूल्य के रूप में व्यक्त किया अन्य। expr1 और expr2 दिनांक या दिनांक-और-समय अभिव्यक्तियां हैं। गणनाओं में केवल मूल्यों के दिनांक भाग का उपयोग किया जाता है।

mysql> DateDiff का चयन करें ('2007-12-31 23:59:59', '2007/12/30'); -> 1

mysql> चयन डेटाडिफ़ ('2010-11-30 23:59:59', '2010-12-31'); -> -31

+1

साल तुलना के लिए असंभव है। जब तक आप वर्ष को अनदेखा नहीं करते हैं तब तक आप किसी भी पंक्ति को पुनर्प्राप्त नहीं करेंगे। –

+0

मैं वर्षगांठ से 'चयन डेटा (CURTIME(), जन्मदिन) करते समय 'NULL' प्राप्त कर रहा हूं ...? – user151841

+0

'जन्मदिन' का प्रकार क्या है, मुझे लगता है कि डेटटाइम सही है? – alejandrobog

0

यदि आप जन्मदिन जन्मतिथि से अलग संग्रहीत तुम वास्तव में एक सूचकांक इस्तेमाल कर सकते हैं। जन्मदिन स्तंभ वर्ष और माह के लिए होता है, लेकिन सभी (उदाहरण के लिए 2000,) उसी वर्ष के लिए होगा।

तो फिर तुम इस तरह आपकी क्वेरी करना चाहते हैं:

SELECT birthdate 
FROM Anniversaries 
WHERE birthday >= DATE_ADD(MAKEDATE(2000, DAYOFYEAR(CURDATE())), INTERVAL 10 DAYS) 

जबकि अभिव्यक्ति बिल्कुल के रूप में आप इच्छित, 10 नंबर अभिव्यक्ति के दाईं ओर अब भी है नहीं है। अभिव्यक्ति के दाईं ओर समारोह को लागू करने और अभिव्यक्ति की बाईं ओर बस स्तंभ रखने MySQL जन्मदिन स्तंभ पर एक सूचकांक का उपयोग करने (यह मानते हुए आप एक सूचकांक है) की अनुमति देता है।

0

alejandrobog के जवाब के आधार पर:

SELECT birthdate FROM Anniversaries 
WHERE DATEDIFF(MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(birthdate), CURRENT_DATE()) >= 0 
AND DATEDIFF(MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(birthdate), CURRENT_DATE()) <= 10 
+0

मुझे नहीं लगता कि यह ओपी चाहता है। यह जन्मदिन देता है जो इस वर्ष पहले से ही हुआ है, अगले 10 दिनों में जन्मदिन नहीं। –

+0

मुझे इन SQL चाल प्रश्नों से बचने की आवश्यकता है। * पंक्ति का चयन करें और कोड में गणना करें। –

0

MAKEDATE() एक साल से एक तिथि और वर्ष के दिन पैदा करता है, तो मैं तस्वीर से बाहर पुराने साल प्राप्त करने के लिए उपयोग कर सकते हैं:

SELECT 
    anniversary 
    , MAKEDATE(YEAR(NOW()), DAYOFYEAR(anniversary)) AS thisyear 
FROM Anniversaries; 

+-------------+-------------+ 
| anniversary | thisyear | 
+-------------+-------------+ 
| 1978-07-29 | 2010-07-29 | 
| 1959-04-17 | 2010-04-17 | 
+-------------+-------------+ 

फिर मैं DATEDIFF() का उपयोग कर सकता हूं (या उससे) तक दिनों की गणना:

SELECT 
    anniversary 
    , MAKEDATE(YEAR(NOW()), DAYOFYEAR(anniversary)) AS thisyear 
    , DATEDIFF(MAKEDATE(YEAR(NOW()),DAYOFYEAR(anniversary)), NOW()) as days 
FROM Anniversaries; 

+-------------+-------------+------+ 
| anniversary | thisyear | days | 
+-------------+-------------+------+ 
| 1978-07-29 | 2010-07-29 | 70 | 
| 1959-04-17 | 2010-04-17 | -33 | 
+-------------+-------------+------+ 

अब मानते हैं() 5/20 है।


संपादित तो ऊपर साल रोलओवर पर काम नहीं करता। एक समाधान एक और गणना जोड़ना है, जहां सालगिरह अगले वर्ष है। यहाँ मैं तारीख '2010-12-31' हार्ड-कोडेड है, और दिनों से मेल खाने वाले के आधार पर फ़िल्टर करने के लिए एक HAVING खंड में एक OR इस्तेमाल किया या तो इस साल या अगले:

SELECT birth_date 
, MAKEDATE(YEAR('2010-12-31'),DAYOFYEAR(birth_date)) as anniversary 
, DATEDIFF(MAKEDATE(YEAR('2010-12-31'),DAYOFYEAR(birth_date)), '2010-12-31') as days 
, MAKEDATE(YEAR(NOW())+ 1,DAYOFYEAR(birth_date)) as next_anniversary 
, DATEDIFF(MAKEDATE(YEAR(NOW())+ 1,DAYOFYEAR(birth_date)), '2010-12-31') as next_days 
FROM Anniversaries 
HAVING ((days <= 25 AND days > 0) OR next_days <= 25); 

+------------+-------------+------+------------------+-----------+ 
| birth_date | anniversary | days | next_anniversary | next_days | 
+------------+-------------+------+------------------+-----------+ 
| 2010-01-23 | 2010-01-23 | -342 | 2011-01-23  |  23 | 
| 1975-01-11 | 2010-01-11 | -354 | 2011-01-11  |  11 | 
+------------+-------------+------+------------------+-----------+ 
2 rows in set (0.00 sec) 
+0

देखें कि आपकी क्वेरी कैसे काम करती है जब अब() = 200 9-12-31 –

+0

ठीक है, मैं वास्तव में परीक्षण करने के लिए समय पर वापस नहीं जा सकता, अब मैं कर सकता हूं? : डी – user151841

1

हम क्या हासिल करना चाहते हैं हाल ही में एक तिथि सीमा में होने वाली वर्षगांठ की एक सूची है। इसे प्राप्त करने और रोलओवर को समायोजित करने के लिए हमें तिथि सीमा को कवर करने वाली सभी सालगिरह की एक सूची तैयार करने की आवश्यकता है। मैंने जिस समाधान का उपयोग किया है, पिछले वर्ष, और अगले वर्ष के लिए सालगिरह रिकॉर्ड उत्पन्न करता है और केवल उन रिकॉर्ड को आउटपुट करता है जो दी गई तिथि सीमा के भीतर आते हैं। पिछले साल की सभी तिथियों

SELECT Date_Add(birth_date,INTERVAL (Year(now())-Year(birth_date)-1) YEAR) as dt, 
FROM Anniversaries 
WHERE Date_Add(birth_date,INTERVAL (Year(now())-Year(Date)-1) YEAR) 
BETWEEN Date_sub(now(), INTERVAL 7 Day) AND Date_add(now(), INTERVAL 21 Day) 
UNION 
SELECT Date_Add(birth_date,INTERVAL (Year(now())-Year(birth_date)) YEAR) as dt, 
FROM Anniversaries 
WHERE Date_Add(birth_date,INTERVAL (Year(now())-Year(Date)) YEAR) 
BETWEEN Date_sub(now(), INTERVAL 7 Day) AND Date_add(now(), INTERVAL 21 Day) 
UNION 
SELECT Date_Add(birth_date,INTERVAL (Year(now())-Year(birth_date)+1) YEAR) as dt, 
FROM Anniversaries 
WHERE Date_Add(birth_date,INTERVAL (Year(now())-Year(Date)+1) YEAR) 
BETWEEN Date_sub(now(), INTERVAL 7 Day) AND Date_add(now(), INTERVAL 21 Day) 
ORDER BY dt 

पहले SELECT कथन वेतन वृद्धि और किसी भी आइटम चालू वर्ष के बगल में SELECT कथन वेतन वृद्धि सभी दिनांक और प्रदान की तिथि सीमा में आते हैं का चयन करता है: संघ क्वेरी इस तरह दिखता है प्रदान की गई तिथि सीमा में आने वाले किसी भी आइटम का चयन करता है अंतिम चयन कथन अगले वर्ष की सभी तिथियों में वृद्धि करता है और प्रदान की गई दिनांक सीमा में आने वाली किसी भी आइटम का चयन करता है अंत में यह सभी तिथि के अनुसार आदेश दिया जाता है।

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

0
 SELECT firstName, lastName, DOB, if((
    datediff(date(concat(year(current_date) , '-', month(DOB) , '-', day(DOB))) , current_date)) >=0, (
    datediff(date(concat(year(current_date) , '-', month(DOB) , '-', day(DOB))) , current_date)), 
    datediff(date(concat(year(current_date) +1, '-', month(DOB) , '-', day(DOB))) , current_date) 
)DAYSTOBDAY 
    FROM birthinfo 
    WHERE (
    if((
    datediff(date(concat(year(current_date) , '-', month(DOB) , '-', day(DOB))) , current_date)) >=0, (
    datediff(date(concat(year(current_date) , '-', month(DOB) , '-', day(DOB))) , current_date)), 
    datediff(date(concat(year(current_date) +1, '-', month(DOB) , '-', day(DOB))) , current_date) 
    ) 
    ) 
    BETWEEN 0 
    AND 31 

    firstName lastName DOB    DAYSTOBDAY 
    Michelle  Smith  1979-04-16   17 
    Kirsten  Dunst  1982-04-30   31 

यह अब तक किया जा रहा से एक 'अच्छा' का जवाब यह हास्यास्पद नहीं है, लेकिन है कि काम करता है मेरे सिर के ऊपर से। आप जो चाहते हैं उसे प्राप्त करने के लिए। मैंने प्रथम नाम, अंतिम नाम और डीओबी के साथ एक टेबल बनाई है, आप बस इसे बिल्कुल चारों ओर बदल सकते हैं।

+0

भी ... मेकडेट (वर्ष (वर्तमान_डेट), डेयॉफीयर (डॉब) का उपयोग करना, तिथि कथन पर संगत की बजाय काम नहीं करता है जब आप लीप वर्षों को शामिल करते हैं। उपरोक्त बयान मुझे विश्वास है कि लीप साल आदि के लिए पूरा करता है। –

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