केवल महीने और वर्ष के आधार पर mySQL का चयन करें


102

मेरे mySQL DB में एक कॉलम है जिसमें कुछ पंक्तियाँ हैं। इस पंक्ति में से एक DATE है, जैसे:2012-02-01

मैं जो हासिल करना चाहता हूं वह केवल वर्ष और महीने के आधार पर PHP के साथ एक SELECT करना है।

SELECT का तर्क निम्नलिखित होगा:

$q="SELECT * FROM projects WHERE Date="SELECT HERE THE SPECIFIC YEAR AND MONTH"";

विशिष्ट महीना और वर्ष $_POSTइस तरह से एक चर से पारित किया जाएगा$_POST['period']="2012-02";

मैं यह कैसे कर सकता हूं?


2

जवाबों:


208
SELECT * FROM projects WHERE YEAR(Date) = 2011 AND MONTH(Date) = 5

5
जब तक MySQL में कुछ ऑप्टिमाइज़ेशन नहीं है, जिसकी मुझे जानकारी नहीं है, तब तक आपकी क्वेरी को स्केल नहीं करना पड़ेगा।
anfxx

2
क्या यह सच है EXTRACT(YEAR_MONTH FROM Date)?
23

19

यदि आपके पास है

$_POST['period'] = "2012-02";

सबसे पहले, महीने का पहला दिन खोजें:

$first_day = $_POST['period'] . "-01"

Dateयदि आपके पास एक है तो यह क्वेरी एक सूचकांक का उपयोग करेगी :

$q = "
    SELECT *  
    FROM projects 
    WHERE Date BETWEEN '$first_day' 
                   AND LAST_DAY( '$first_day' )
     " ;

एक भी समावेशी अनन्य अंतराल है, जो बहुत अच्छी काम इस्तेमाल कर सकते हैं (यदि स्तंभ है आप चिंता की जरूरत नहीं है DATE, DATETIMEया TIMESTAMP, और न ही परिशुद्धता के बारे में:

$q = "
    SELECT *  
    FROM projects 
    WHERE Date >= '$first_day' 
      AND Date  < '$first_day' + INTERVAL 1 MONTH 
     " ;

सुरक्षा चेतावनी:

आपको इन मूल्यों से ठीक से बचना चाहिए या तैयार कथनों का उपयोग करना चाहिए। संक्षेप में, किसी भी SQL इंजेक्शन मुद्दों से बचने के लिए PHP में इन दिनों जो भी विधि की सिफारिश की जाती है, उसका उपयोग करें।


2
हाँ, बीच में +1, मैं शुरू में ईयर + मंथ फंक्शन्स का उपयोग कर रहा था, लेकिन इस तरह न तो स्केल हुआ, न ही इंडेक्स का उपयोग हुआ।
सोबेलिटो

@sobelito हाँ। मैं आमतौर पर समावेशी-अनन्य अंतराल पसंद करता हूं। पोस्ट अपडेट की गई।
ypercube y

कृपया इन मूल्यों से बचें या तैयार बयानों का उपयोग करें ... these
Jared

9

हेयर यू गो। कंप्यूटिंग को PHP पर छोड़ दें और अपने DB को कुछ काम बचाएं। इस तरह आप Dateकॉलम पर एक इंडेक्स का प्रभावी उपयोग कर सकते हैं ।

<?php
    $date = $_POST['period'];

    $start = strtotime($date);
    $end   = strtotime($date . ' 1 month - 1 second');

    $query = sprintf(
        'SELECT *
           FROM projects
          WHERE Date BETWEEN FROM_UNIXTIME(%u) AND FROM_UNIXTIME(%u)',
        $start,
        $end
    );

EDIT
यूनिक्स टाइमस्टैम्प रूपांतरण को भूल गया।


यह इंडेक्स फ्रेंडली है, लेकिन स्ट्रेटोटाइम आपको इंट देता है और आपको इसे पहले mysql की तारीख में बदलने की जरूरत है।
पोट्ट्रम

यह $end = strtotime($date .' 1 month - 1 second');
समवर्ती


6

मान लीजिए कि आपके पास एक डेटाबेस फ़ील्ड बनाया गया है_ जहां आप टाइमस्टैम्प से मूल्य लेते हैं। आप create_at date से Year & Month तक खोज करना चाहते हैं।

YEAR(date(created_at))=2019 AND MONTH(date(created_at))=2

3

यहाँ, MySQL में MONTH और DATE द्वारा FIND रिकॉर्ड

यहां आपका POST मान है $_POST['period']="2012-02";

बस, डैश द्वारा मूल्य विस्फोट $Period = explode('-',$_POST['period']);

विस्फोट मान से सरणी प्राप्त करें:

Array ( [0] => 2012 [1] => 02 )

SQL क्वेरी में मूल्य डालें:

SELECT * FROM projects WHERE YEAR(Date) = '".$Period[0]."' AND Month(Date) = '".$Period[0]."';

MONTH और YEAR द्वारा परिणाम प्राप्त करें।


2

दिनांक स्तंभ से माह और वर्ष मान प्राप्त करने के लिए

select year(Date) as "year", month(Date) as "month" from Projects


1

तर्क होगा:

SELECT * FROM objects WHERE Date LIKE '$_POST[period]-%';

LIKEऑपरेटर सभी पंक्तियां के साथ शुरू चुन लिए जाएँगे $_POST['period']पानी का छींटा के बाद और मोंट का दिन

http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html - कुछ अतिरिक्त जानकारी


4
-1 डेटा पर स्ट्रिंग संचालन आंतरिक रूप से एक पूर्णांक के रूप में दर्शाया गया है !? तुम गंभीर हो?
anfxx

@ यारोस्लाव हाँ, अत्यधिक कुशल, मुझे लगता है: D
aefxx

2
सूचकांक के बिना। यह पहली तारीख को स्ट्रिंग में बदल देता है और उस स्ट्रिंग से मेल खाता है। MySQL में किसी भी कॉलम प्रकार को LIKE द्वारा क्वेर किया जा सकता है। लेकिन फिर भी यह काम करेगा: D
यारोस्लाव

2
छोटी बॉबी किसी को भी टेबल करती है?
रोब

हर समय प्रदर्शन के लिए पागल होने की आवश्यकता नहीं है, अब आप करते हैं। कभी-कभी किसी चीज को तेजी से काम करने के लिए आप जो प्रयास और समय लगाते हैं, उससे कुछ माइक्रोसेकंड तेजी से काम करता है, इससे कोई फर्क नहीं पड़ता है, लेकिन आपने उस समय को खो दिया है।
हिस्त्रो पेटेव

0

यहां एक क्वेरी है जिसका मैं उपयोग करता हूं और यह प्रत्येक रिकॉर्ड को राशि के रूप में एक अवधि के भीतर वापस कर देगा।

यहाँ कोड है:

$result = mysqli_query($conn,"SELECT emp_nr, SUM(az) 
FROM az_konto 
WHERE date BETWEEN '2018-01-01 00:00:00' AND '2018-01-31 23:59:59' 
GROUP BY emp_nr ASC");

echo "<table border='1'>
<tr>
<th>Mitarbeiter NR</th>
<th>Stunden im Monat</th>
</tr>";

while($row = mysqli_fetch_array($result))
{
$emp_nr=$row['emp_nr'];
$az=$row['SUM(az)'];
echo "<tr>";
echo "<td>" . $emp_nr . "</td>";
echo "<td>" . $az . "</td>";
echo "</tr>";
}
echo "</table>";
$conn->close();
?>

यह प्रत्येक एम्प_nr और उन मासिक घंटों के योग को सूचीबद्ध करता है जो उन्होंने जमा किए हैं।


0

आप इसे $ q बदलकर इसे कर सकते हैं:

$q="SELECT * FROM projects WHERE YEAR(date) = $year_v AND MONTH(date) = $month_v;

-1

हाँ, यह काम कर रहा है, लेकिन यह केवल एक पंक्ति लौटाता है जबकि केवल चयनित स्तंभों का उपयोग करने के लिए कई पंक्तियाँ होती हैं। सेलेक्ट टाइटल की तरह, Mytable से तारीख जहां YEAR (तिथि) = 2017 और महीने (तारीख) = 09 केवल एक पंक्ति में वापस आती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.