শুধুমাত্র মাস এবং বছরের উপর ভিত্তি করে মাইএসকিউএল নির্বাচন করুন


103

আমার আমার এসকিউএল ডিবিতে একটি কলাম রয়েছে যার কয়েকটি সারি রয়েছে। এই সারির একটি হল একটি তারিখ, এর মতো:2012-02-01

আমি যেটি অর্জন করতে চাই তা হ'ল কেবল বছর এবং মাসের ভিত্তিতে পিএইচপি সহ একটি নির্বাচন করুন।

SELECT এর যুক্তি নিম্নলিখিত হবে:

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

নির্দিষ্ট মাস এবং বছরটি এর $_POSTমতো একটি চলক থেকে পাস করা হবে$_POST['period']="2012-02";

আমি এটা কিভাবে করবো?


4
আপনি বিটওয়েন বিবৃতিটি ব্যবহার করতে পারেন
বেন কেরি

উত্তর:


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

6
আপনার ক্যোয়ারিটি স্কেল করবে না কারণ মাইএসকিউএলে এমন কিছু অপ্টিমাইজেশন না রয়েছে যার বিষয়ে আমি অবগত নই তবে এটি একটি পূর্ণ টেবিল স্ক্যান করা দরকার।
এফএক্সএক্সএক্স

4
এটা কি সত্য EXTRACT(YEAR_MONTH FROM Date)?
cmbuckley

20

যদি তোমার থাকে

$_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 
     " ;

নিরাপত্তা সতর্কতা:

আপনার এই মানগুলি যথাযথভাবে পালানো বা প্রস্তুত বিবৃতি ব্যবহার করা উচিত। সংক্ষেপে, কোনও এসকিউএল ইঞ্জেকশন সমস্যা এড়াতে, পিএইচপি-তে এই দিনটিতে যে কোনও পদ্ধতি সুপারিশ করা হয়েছে তা ব্যবহার করুন।


4
হ্যাঁ, এর মধ্যে +1, আমি প্রাথমিকভাবে বছর + মাসের ফাংশনগুলি ব্যবহার করছিলাম তবে এগুলি স্কেল করে না বা সূচকগুলিও ব্যবহার করে না।
sobelito

@ সোবেলিটো হ্যাঁ আমি সাধারণত অন্তর্ভুক্ত-একচেটিয়া অন্তর পছন্দ করি। পোস্ট আপডেট হয়েছে।
ypercubeᵀᴹ

দয়া করে এই মানগুলি থেকে বাঁচুন বা প্রস্তুত বিবৃতি ব্যবহার করুন ... 😓
জেরেদ

9

আপনি এখানে যান। পিএইচপি তে কম্পিউটিং ছেড়ে আপনার ডিবিকে কিছু কাজ সংরক্ষণ করুন। এইভাবে আপনি 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
    );

সম্পাদনা
ইউনিক্স টাইমস্ট্যাম্প রূপান্তরটি ভুলে গেছেন।


এটি সূচক বান্ধব, তবে স্ট্রোটোটাইম আপনাকে পূর্বনির্দেশ দেয় এবং আপনাকে প্রথমে mysql এর জন্য এটিকে রূপান্তর করতে হবে।
পাইওটর্ম

এটি যোগফলের চেয়ে স্ট্রিং কনটেন্টেশন হওয়া উচিত:$end = strtotime($date .' 1 month - 1 second');
কনস্টান্টিন পেরিয়াস্লোভ


6

ধরুন আপনার কাছে একটি ডাটাবেস ক্ষেত্র তৈরি হয়েছে_ যেখানে আপনি টাইমস্ট্যাম্প থেকে মান গ্রহণ করেন। আপনি তৈরি_আর তারিখ থেকে বছর এবং মাস অনুসারে অনুসন্ধান করতে চান।

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

3

এখানে, MySQL এ MONTH এবং তারিখের দ্বারা রেকর্ডটি সন্ধান করুন

এখানে আপনার পোস্ট মান $_POST['period']="2012-02";

শুধু, ড্যাশ দ্বারা বিস্ফোরিত মান $Period = explode('-',$_POST['period']);

বিস্ফোরিত মান থেকে অ্যারে পান:

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

এসকিউএল ক্যোয়ারিতে মান রাখুন:

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

মাস এবং YEAR দ্বারা ফলাফল পান Get


2

যুক্তিটি হ'ল:

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

LIKEঅপারেটর সব সারি যে দিয়ে শুরু নির্বাচন করব $_POST['period']ড্যাশ দ্বারা অনুসরণ এবং Mont দিনে

http://dev.mysql.com/doc/refman/5.0/en/pattern-matching.html - কিছু অতিরিক্ত তথ্য


4
-1 ডেটাতে স্ট্রিং অপারেশনগুলি অভ্যন্তরীণভাবে একটি পূর্ণসংখ্যা হিসাবে প্রতিনিধিত্ব করে !? আপনি গুরুতর?
এফএক্সএক্সএক্স

@ ইয়ারোস্লাভ হ্যাঁ, অত্যন্ত দক্ষ, আমি মনে করি: ডি
এএফএক্সএক্স

4
সূচক ছাড়া। এটি প্রথমে তারিখের মানটিকে স্ট্রিংয়ে রূপান্তর করে এবং সেই স্ট্রিংয়ের সাথে মেলে। মাইএসকিউএল-তে যে কোনও কলামের ধরণ LIKE দ্বারা অনুসন্ধান করা যেতে পারে। তবে এখনও এটি কাজ করবে: ডি
ইয়ারোস্লাভ

4
ছোট ববি টেবিল কারও?
রব

সব সময় পারফরম্যান্স নিয়ে পাগল হওয়ার দরকার নেই, এখন আপনিও করুন। কখনও কখনও আপনি যে প্রচেষ্টা এবং সময়টিকে কিছুটা মাইক্রোসেকেন্ডে দ্রুত কাজ করার জন্য রেখেছিলেন তাতে কোনও তাত্পর্য হয় না, তবে আপনি সেই সময়টি হেরে গেছেন।
হিস্টো পেতেভ



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();
?>

এটি প্রতিটি এম_এনআর এবং তারা যে মাসিক ঘন্টা জমেছে তার যোগফলকে তালিকাবদ্ধ করে।


0

আপনি এটিতে $ q পরিবর্তন করে এটি করতে পারেন:

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

0

কেউ কর্মক্ষমতা কথা বলা ঠিক হবে তাই আমি দুই সবচেয়ে জনপ্রিয় উত্তর পরীক্ষিত বলে মনে হয় মাইএসকিউএল থেকে নমুনা ডাটাবেসের । কাঠামো সহ টেবিলটিতে 2.8M সারি রয়েছে

CREATE TABLE `salaries` (
  `emp_no` int(11) NOT NULL,
  `salary` int(11) NOT NULL,
  `from_date` date NOT NULL,
  `to_date` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `salaries`
  ADD PRIMARY KEY (`emp_no`,`from_date`);

এখানে পরীক্ষাগুলি সম্পাদিত এবং ফলাফল রয়েছে

SELECT * FROM `salaries` WHERE YEAR(from_date) = 1992 AND MONTH(from_date) = 6
12339 results
-----------------
11.5 ms 
12.1 ms
09.5 ms
07.5 ms
10.2 ms
-----------------
10.2 ms Avg
-----------------


SELECT * FROM `salaries` WHERE from_date BETWEEN '1992-06-01' AND '1992-06-31'
-----------------
10.0 ms
10.8 ms
09.5 ms
09.0 ms
08.3 ms
-----------------
09.5 ms Avg
-----------------


SELECT * FROM `salaries` WHERE YEAR(to_date) = 1992 AND MONTH(to_date) = 6
10887 results
-----------------
10.2 ms
11.7 ms
11.8 ms
12.4 ms
09.6 ms
-----------------
11.1 ms Avg
-----------------


SELECT * FROM `salaries` WHERE to_date BETWEEN '1992-06-01' AND '1992-06-31'
-----------------
09.0 ms
07.5 ms
10.6 ms
11.7 ms
12.0 ms
-----------------
10.2 ms Avg
-----------------

আমার সিদ্ধান্তে

  1. BETWEEN উভয় সূচকযুক্ত এবং আন-ইনডেক্স করা কলামে কিছুটা ভাল ছিল।
  2. আন-ইনডেক্সড কলামটি ইনডেক্সড কলামের তুলনায় সামান্য ধীর ছিল।

-1

হ্যাঁ এটি কাজ করছে তবে এটি কেবলমাত্র নির্বাচিত কলামগুলি পুনরুদ্ধার করার জন্য বেশ কয়েকটি সারি থাকা অবস্থায় কেবল এক সারিটি ফেরত দেয়। নির্বাচন শিরোনামের মতো, Mytable থেকে তারিখ যেখানে বছর (তারিখ) = 2017 এবং মাস (তারিখ) = 09 কেবল একটি সারি প্রদান করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.