खालिद का जवाब ज्यादातर समय सही होता है। लीप ईयर गड़बड़ कर देता है चीजें! यदि आप प्रस्तावित क्वेरी चलाते हैं जहां डेटकॉल का मान '2016-02-29' है और CURRENT_DATE '2017-01-01' है, उदाहरण के लिए, आपको null
मिलता है .
ऐसा करने का एक वैकल्पिक तरीका जो लीप वर्ष को अधिक सुंदर ढंग से संभालता है वह इस प्रकार है:
SELECT DATE_FORMAT(
MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
'%Y-%m-%d'
) `date`
FROM t
date
. का मान यहां 2017-03-01 होगा।
संपादित करें/स्पष्टीकरण:समस्या यह है कि '2016-02-29' के वर्ष को 2017 में बदलने से, उदाहरण के लिए, '2017-02-29' उत्पन्न होता है, जो एक मान्य तिथि नहीं है। फिर, DATE_FORMAT('2017-02-29', '%Y-%m-%d') चलाने से null
परिणाम मिलता है . समस्या का एक डेमो यहां है:
http://sqlfiddle.com/#!9/c5358/11
हालांकि, मेरे उत्तर की समीक्षा करने के बाद मुझे एहसास हुआ कि 28 फरवरी के बाद लीप वर्ष पर किसी भी तारीख के बाद से MAKEDATE का उपयोग करके मुझे एक और समस्या 365 दिनों के साथ "सामान्य" वर्ष के लिए दिन + 1 है। उदाहरण के लिए, यदि datecol ='2016-03-01' और चालू वर्ष 2017 थे तो परिवर्तित तिथि '2017-03-02' होगी, न कि '2017-03-01' इच्छानुसार। एक बेहतर तरीका इस प्रकार है:
SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;
यह विधि किसी भी 29 फरवरी को 28 तारीख में बदल देती है, और अन्यथा अन्य सभी तिथियों को ठीक वैसे ही रखती है जैसे आप उनसे अपेक्षा करते हैं। समाधान का एक डेमो यहां है:
http://sqlfiddle.com/#!9/c5358/12