পূর্ববর্তী মাস থেকে সমস্ত সারি পেতে প্রশ্ন


90

আমাকে আমার ডাটাবেসে সমস্ত সারি নির্বাচন করতে হবে যা গত মাসে তৈরি হয়েছিল।

উদাহরণস্বরূপ, যদি চলতি মাস জানুয়ারী হয়, তবে আমি ডিসেম্বরে তৈরি হওয়া সমস্ত সারিটি ফিরিয়ে দিতে চাই, যদি মাস ফেব্রুয়ারি হয় তবে আমি জানুয়ারীতে তৈরি হওয়া সমস্ত সারি ফিরিয়ে দিতে চাই। আমি একটি আছে date_createdআমার ডাটাবেসের মধ্যে কলাম যে তালিকা এই বিন্যাসে নির্মিত তারিখ: 2007-06-05 14:50:17

উত্তর:


198
SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)

70
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
গাজানফার মীর

12
@ গাজানফারমির আপনার ক্যোয়ারী প্রশ্নের পুরোপুরি মেলে না, যেখানে উপরের উত্তরটি দেয়। আপনার গতকালের মধ্য দিয়ে এই মাসের মধ্যে সারিগুলি ফেরত দিন।
ম্যাট পাসেল

@ ম্যাটপ্যাসেল আমি দুঃখিত, তবে betweenএই সীমানা অন্তর্ভুক্ত .. এতে বর্তমান তারিখটিও অন্তর্ভুক্ত থাকবে। কেন / কিভাবে এটি গতকাল সীমাবদ্ধ থাকবে ?? সম্প্রসারিত করুন?
গজানফার মীর

4
আমি আপনার বলতে চাইছি .. হ্যাঁ আপনি ঠিক বলেছেন .. আমার প্রশ্ন ওপি যা চেয়েছিল তা নয় .. আমি প্রশ্নটি ভুল
বুঝেছিলাম

current_dateআজ যদি তা না হয় তবে ক্লায়েন্টের কাছ থেকে দেওয়া এলোমেলো তারিখ কী হবে?
dios231

22

এখানে অন্য বিকল্প। ধরে নেওয়া যায় আপনার একটি সূচকযুক্ত DATEবা DATETIMEটাইপ ক্ষেত্র রয়েছে, এটি সূচকটি ব্যবহার করা উচিত কারণ সূচী ব্যবহারের আগে বিন্যাসিত তারিখগুলি রূপান্তরিত হবে। এরপরে EXPLAIN এর সাথে দেখা হওয়ার পরে আপনাকে কোয়েরির rangeচেয়ে কোয়েরি দেখতে হবে ।index

SELECT
    * 
FROM
    table
WHERE 
    date_created >= DATE_FORMAT( CURRENT_DATE - INTERVAL 1 MONTH, '%Y/%m/01' ) 
AND
    date_created < DATE_FORMAT( CURRENT_DATE, '%Y/%m/01' )

+1 আরও অনেক সূচক বান্ধব। এছাড়াও আপনি একটি নিক্ষেপ করা হতে পারে STR_TO_DATEপ্রায় DATE_FORMATতাই এটি সবসময় তারিখ বস্তুর সঙ্গে তার আচরণ করা হয়।
লে

14

ভবিষ্যতের তারিখ না থাকলে ...

SELECT * 
FROM   table_name 
WHERE  date_created > (NOW() - INTERVAL 1 MONTH);

পরীক্ষিত।


4
আমি মনে করি তারা আলাদা কিছু খুঁজছিল। অর্থাৎ গত মাসের সমস্ত রেকর্ড (যেমন 1 অক্টোবর - 31 অক্টোবর, 2012 23:59:59)। উপরের ক্যোয়ারীটি আজকের তারিখ এবং সময় থেকে শেষ ~ 30 বা এত দিন ফিরে আসবে ।
লেইগ করুন

13

বিকল্পভাবে হোবডাভের উত্তর

SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)

আপনি এক্সট্রা্যাক্ট দিয়ে এটি অর্জন করতে পারেন, YEAR_MONTH ইউনিট হিসাবে ব্যবহার করে, সুতরাং আপনার যেমন এবং এর প্রয়োজন হবে না:

SELECT * FROM table
WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL
1 MONTH)

এটি কয়েক মাস ধরে দুর্দান্ত কাজ করে তবে দুর্ভাগ্যক্রমে কোনও YEAR_WEEK সাময়িক বিরতি নেই , তাই যদি আপনাকে মাসের পরিবর্তে সপ্তাহের প্রয়োজন হয় তবে আপনাকে হোবডাভের উত্তরে ফিরে যেতে হবে।
ড্যানি বেকেট

8
SELECT *
FROM  yourtable
where DATE_FORMAT(date_created, '%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 month),'%Y-%m')

এটি গত 30 বা 31 দিনের রেকর্ডগুলির বিপরীতে পূর্ববর্তী ক্যালেন্ডার মাসের সমস্ত রেকর্ড ফিরিয়ে আনবে।


আমি উল্লেখ করতে ভুলে গেছি ... এটি গত 30 বা 31 দিনের রেকর্ডগুলির বিপরীতে পূর্ববর্তী ক্যালেন্ডার মাসের সমস্ত রেকর্ড ফিরিয়ে আনবে।
গ্রেগ

আমার মতে এটি গ্রহণযোগ্য উত্তর হওয়া উচিত কারণ এটি গৃহীত উত্তরের চেয়ে সহজ তবে এখনও একই ফলাফল সরবরাহ করে
গ্র্যান্ট

3

যদিও এই প্রশ্নের উত্তর ইতিমধ্যে নির্বাচন করা হয়েছে, তবে আমি বিশ্বাস করি যে সহজতম ক্যোয়ারী হবে

SELECT * 
FROM table 
WHERE 
date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();

4
না, বেশ না। @ হোবডাভ
ম্যাট পাসেল

@ ম্যাটপ্যাসেল আপনি ঠিক বলেছেন, আমি প্রশ্নটি ভুল বুঝেছি .. আমি এই বিষয়টিটি মিস করেছি যে ফলাফলটি কেবলমাত্র গত মাসের রেকর্ডের মধ্যে সীমাবদ্ধ থাকতে হবে।
গাজানফার মীর

2
WHERE created_date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) 
  AND created_date <= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), INTERVAL 0 DAY) 

এটি আমার জন্য কাজ করেছে (আপনি এই মাসের ক্যোয়ারি চালানোর দিন নির্বিশেষে গত মাসে তৈরি করা সমস্ত রেকর্ড নির্বাচন করে)


1

select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');

আপনার ডেট_ক্রিয়েটেডটি যদি সূচকযুক্ত হয় তবে এটি কোনও সূচকের সুবিধা নিতে সক্ষম হবে, কারণ এটি ক্ষেত্রের মানটিতে কোনও রূপান্তর ফাংশন প্রয়োগ করে না।


@ggiroux - যদিও LIKE প্রয়োগ করার আগে তারিখটিকে একটি চরিত্রের ধরণে রূপান্তর করতে হবে না।
মার্টিন ক্লেটন

হ্যাঁ, তবে এখনও নির্বাচিত উত্তর আইএমএইচওর তুলনায় একটি উন্নতি হয়েছে (আইএফএফ তারিখ_সৃজনিত সূচিযুক্ত)
ggiroux

1

গত মাসের রেকর্ডগুলি পেতে এখানে ক্যোয়ারী রয়েছে:

SELECT *
FROM `tablename`
WHERE `datefiled`
BETWEEN DATE_SUB( DATE( NOW( ) ) , INTERVAL 1
MONTH )
AND 
LAST_DAY( DATE_SUB( DATE( NOW( ) ) , INTERVAL 1
MONTH ) )

শ্রদ্ধা - সাকিব


আপনি কি এই ক্যোয়ারী চালানোর চেষ্টা করেছেন? যতদূর আমি দেখছি, এটি পূর্ববর্তী মাসগুলি থেকে সমস্ত তারিখগুলি নির্বাচন করবে না (যেমন: পুরো ফেব্রুয়ারি জুড়ে জানুয়ারী থেকে ফেরত তথ্য) তবে এক মাস আগে একই দিন থেকে শুরু হওয়া একটি পরিসীমা থেকে ডেটা ফেরত দেয়
নিকো হায়েস

0

একক শর্ত সঙ্গে বিকল্প

SELECT * FROM table
WHERE YEAR(date_created) * 12 + MONTH(date_created)
    = YEAR(CURRENT_DATE) * 12 + MONTH(CURRENT_DATE) - 1

-1
SELECT *  FROM table  
WHERE  YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)

আপনি কি এই ক্যোয়ারী চালানোর চেষ্টা করেছেন? যতদূর আমি দেখছি, এটি আগের মাসের সমস্ত তারিখগুলি নির্বাচন করবে না (যেমন: পুরো ফেব্রুয়ারি জুড়ে জানুয়ারি থেকে ফেরত তথ্য) তবে এক মাস আগে একই দিন থেকে শুরু হওয়া একটি পরিসীমা থেকে ডেটা ফেরত দেয়
নিকো হায়েস

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