मुझे लगता है कि यह प्रश्न वही करेगा जो आप चाहते हैं। यह उपयोग करता है
(YEAR(CURDATE())*12+MONTH(CURDATE()))
- (YEAR(STR_TO_DATE(join_date, '%d-%m-%Y'))*12+MONTH(STR_TO_DATE(join_date, '%d-%m-%Y'))) -
- 1
उपयोगकर्ता के लिए पूरे महीनों के अनुभव प्राप्त करने के लिए,
DAY(LAST_DAY(STR_TO_DATE(join_date, '%d-%m-%Y')))
- DAY(STR_TO_DATE(join_date, '%d-%m-%Y'))
+ 1
पहले महीने में दिनों की संख्या प्राप्त करने के लिए, और
DAY(CURDATE())
चालू माह में दिनों की संख्या प्राप्त करने के लिए। दो दिन की गणना का योग किया जाता है और यदि कुल> 15 है, तो पूरे महीनों की संख्या में 1 जोड़ दिया जाता है, उदा.
SELECT id
, name
, (YEAR(CURDATE())*12+MONTH(CURDATE())) - (YEAR(STR_TO_DATE(join_date, '%d-%m-%Y'))*12+MONTH(STR_TO_DATE(join_date, '%d-%m-%Y'))) - 1 -- whole months
+ CASE WHEN DAY(LAST_DAY(STR_TO_DATE(join_date, '%d-%m-%Y'))) - DAY(STR_TO_DATE(join_date, '%d-%m-%Y')) + 1 + DAY(CURDATE()) > 15 THEN 1 ELSE 0 END -- broken month
AS months
FROM user
हम इस अभिव्यक्ति का उपयोग JOIN
. के रूप में कर सकते हैं user
. के बीच की स्थिति और allowed_exp_range
उन सभी उपयोगकर्ताओं को खोजने के लिए जिनके पास एक निश्चित सीमा के भीतर अनुभव है:
SELECT u.id
, u.name
, a.starting_exp_months
, a.end_exp_months
FROM user u
JOIN allowed_exp_range a
ON (YEAR(CURDATE())*12+MONTH(CURDATE())) - (YEAR(STR_TO_DATE(u.join_date, '%d-%m-%Y'))*12+MONTH(STR_TO_DATE(u.join_date, '%d-%m-%Y'))) - 1
+ CASE WHEN DAY(LAST_DAY(STR_TO_DATE(u.join_date, '%d-%m-%Y'))) - DAY(STR_TO_DATE(u.join_date, '%d-%m-%Y')) + 1 + DAY(CURDATE()) > 15 THEN 1 ELSE 0 END
BETWEEN a.starting_exp_months AND a.end_exp_months
आउटपुट (आपके नमूना डेटा के लिए, सभी उपयोगकर्ता शामिल हैं क्योंकि वे सभी एक अनुभव श्रेणी में फिट होते हैं):
id name starting_exp_months end_exp_months
1 Sam 9 24
2 Moe 9 24
3 Tim 0 6
4 Sal 9 24
5 Joe 0 6
मैंने एक छोटा dbfiddle पर डेमो बनाया है जो परिणाम पर पहुंचने के चरणों को प्रदर्शित करता है।