মাইএসকিউএল "এর মধ্যে" ধারাটি অন্তর্ভুক্ত নয়?


142

আমি যদি একটি betweenধারা দিয়ে কোনও ক্যোয়ারী চালনা করি তবে মনে হয় এটি শেষ মানটি বাদ দেয়।
উদাহরণ স্বরূপ:

select * from person where dob between '2011-01-01' and '2011-01-31'

এটি dob'2011-01-01' থেকে '2011-01-30' পর্যন্ত সমস্ত ফলাফল পেয়েছে; dob'2011-01-31' যেখানে রেকর্ডগুলি এড়িয়ে চলেছেন। কেউ কি ব্যাখ্যা করতে পারে যে এই কোয়েরিটি কেন এইরকম আচরণ করে এবং dob'2011-01-31' রেকর্ডগুলি অন্তর্ভুক্ত করার জন্য আমি কীভাবে এটি সংশোধন করতে পারি ? (শেষের তারিখে 1 যোগ না করে কারণ এটি ব্যবহারকারীরা নির্বাচন করেছেন))


নাঃ। আমি আমার মাইএসকিউএল ইনস্টলেশন (সংস্করণ?) BETWEENউভয় মানের জন্য অন্তর্ভুক্ত। আমার MySQL Server 5.7উইন্ডোজ 10 এ আছে
সবুজ

উত্তর:


181

ক্ষেত্রটির dobসম্ভবত একটি সময় উপাদান রয়েছে।

এটি ছাঁটাই করতে:

select * from person 
where CAST(dob AS DATE) between '2011-01-01' and '2011-01-31'

59
পরিবর্তে CAST(dob AS DATE)আপনি আরও সংযোগ ব্যবহার করতে পারেন DATE(dob)
jkndrkn

11
এটি কাজ করার সময়, আপনি ব্যবহার করে >=এবং <পরিবর্তে আরও ভাল পারফরম্যান্স পাবেন between
ডেভিড হার্কনেস

112
আপনি ব্যবহার করে আরও ভাল পারফরম্যান্স পাবেন dob BETWEEN '2011-01-01 00:00:00' AND '2011-01-31 23:59:59। এটি কারণ DATE(dob)প্রতিটি সারির জন্য একটি মান গণনা করতে হয় এবং সেই ক্ষেত্রে কোনও সূচক ব্যবহার করতে পারে না।
জোশুয়াহেদলুন্ড

2
@ জোশুয়াহেলডুন্ড দয়া করে এই সমাধানটির সাথে একটি উত্তর যুক্ত করুন। CAST প্রায় দক্ষ নয়।
doc_id

3
@ জোশুয়াহেল্ডুন্ড এটি আপনার সাথে সময়ের সাথে তথ্য না পাওয়া পর্যন্ত কাজ করে t > 23:59:59 and t < 24:00:00। কেন একেবারে দুর্বলতার সাথে নির্দিষ্ট BETWEENকরা? বরং ডেভিড এর পরামর্শ এবং ব্যবহারের অনুসরণ করুন: WHERE dob >= '2011-01-01' AND dob < '2011-02-01'। সেরা অভিনয়, এবং এটি প্রতিবার কাজ করে।
বিভ্রান্ত

300

থেকে মাইএসকিউএল-ম্যানুয়াল :

এটি প্রকাশের সমান (মিনিট <= এক্সপ্রেড এবং এক্সপ্রেস <= সর্বোচ্চ)


3
এই উত্তরের সাথে লিঙ্কযুক্ত ম্যানুয়ালটি দেখায় যে DATE এবং DATETIME অবজেক্টের তুলনা করার সময় একটি কাস্ট পছন্দ করা হয় preferred সুতরাং আমি অনুমান করি @tiagoinu সবচেয়ে কঠোর অর্থে সবচেয়ে সম্পূর্ণ উত্তর আছে, তবে উভয়ই স্পট।
কিংসলমন

@jemminger হতে পারে কারণ উত্তর থেকে archrival -postgres লোক: পি
nawfal

27
সংক্ষেপে এর মধ্যে অন্তর্ভুক্ত রয়েছে ... এই কারণেই এই উত্তরটি শক দেয়।
রাফায়েল

6
পুরানো মন্তব্য, তবে আমি এটি নির্দিষ্ট প্রশ্নের সাথে টাই করতে চেয়েছিলাম। "বিটউইইইন" অন্তর্ভুক্ত, তবে সময় নির্দিষ্ট প্যাড সহ তারিখগুলি 00:00:00 তে নেই। একটি তারিখের পরিসরের সাথে তুলনা করার ফলে শেষ দিনটি হারাবে। হয় DATE (dob) কল করুন বা দিনের শেষ নির্দিষ্ট করুন।
শীতেmute92

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

99

সমস্যাটি হচ্ছে 2011-01-31 আসলে 2011-01-31 00:00:00। সেদিন থেকেই শুরু। দিনের বেলাতে সমস্ত কিছু অন্তর্ভুক্ত নয়।


19
এটি সত্যিই যা চলছে তা ব্যাখ্যা করে এবং প্রশ্নের উত্তর দেয়।
ইভান পি

3
এই সমস্ত বছর পরে এই উত্তর এখনও সেরা। অনেক ধন্যবাদ.
স্ট্র্যাব

31
select * from person where dob between '2011-01-01 00:00:00' and '2011-01-31 23:59:59'

1
আমি মনে করি এটা যে টুকুনি, এই সময়ে তারিখগুলি অন্তর্ভুক্ত করবে না 2011-01-31 23:59:59কিন্তু সেই আপ অন্তর্ভুক্ত করা হবে 2011-01-31 23:59:58 দিন শেষ দ্বিতীয় অন্তর্ভুক্ত করা হয় না এটা ছোটখাট কিছু হতে পারে কিন্তু কারো কাছ থেকে উপকৃত হবে।
doc_id

1
মাইএসকিউএল ডকুমেন্টেশন থেকে রামনিসব্যাক আমি নিশ্চিত করতে পারি যে শেষ দ্বিতীয়টি অন্তর্ভুক্ত করা হবে যেহেতু বিটুইইন উভয় উপায়ে অন্তর্ভুক্ত রয়েছে। পড়ুন dev.mysql.com/doc/refman/5.5/en/...
Felype

1
হ্যাঁ, @ ফিলিপ আপনি ঠিক বলেছেন। আমি নিজেই এটি মাইএসকিএল ডাটাবেসে পরীক্ষা করেছিলাম। এটি 23:59:59ফলাফল এছাড়াও অন্তর্ভুক্ত । সুতরাং এটি উভয় উপায় অন্তর্ভুক্ত।
ভাগ্যবান

2
যদি dobকলামটি সাব-সেকেন্ড যথার্থতার সাথে টাইমস্ট্যাম্প হয়, তবে তারপরে BETWEEN'2011-02-01 00:00:00' ব্যবহার না করা পর্যন্ত দিনের চূড়ান্ত দ্বিতীয়টির মধ্যে ইভেন্টগুলি মিস করবে না ?
নাইট্রোজেন

1
-1। অন্তর্ভুক্ত করা হবে না 2011-01-31 23:59:59.003। @ নাইট্রোজেন ব্যবহার করে ভুলভাবে 1 ফেব্রুয়ারি শূন্য সময় অন্তর্ভুক্ত করা 2011-02-01 000:00:00হবে .... যার কারণে এবং পরিবর্তে ব্যবহার করা উচিত। >=<
বিভ্রান্ত

6

আপনার ক্যোয়ারিতে আপনি যে ক্ষেত্রটি উল্লেখ করছেন সেটি কি একটি তারিখ টাইপ বা একটি ডেটটাইম টাইপ?

আপনি যে আচরণটি বর্ণনা করেছেন তার একটি সাধারণ কারণ হ'ল আপনি যখন একটি ডেটটাইম টাইপ ব্যবহার করেন যেখানে আপনার সত্যিকারের একটি তারিখ টাইপ ব্যবহার করা উচিত। এটি হ'ল যদি কারও জন্মের সময়টি আপনার সত্যিকারের না জানা থাকে তবে কেবল তারিখের ধরণটি ব্যবহার করুন।

চূড়ান্ত দিনটি আপনার ফলাফলগুলিতে অন্তর্ভুক্ত না হওয়ার কারণটি হল ক্যোয়ারীটি আপনার ক্যোয়ারিতে নির্দিষ্ট করা তারিখগুলির সময় অংশটি ধরে নিচ্ছে।

এটি হ'ল: আপনার কোয়েরিটি 2011-01-30 থেকে 2011-01-31 এর মধ্যে মধ্যরাত পর্যন্ত ব্যাখ্যা করা হচ্ছে, তবে 2011-01-31-এ দিনের কিছু পরে ডেটার কোনও মূল্য থাকতে পারে।

পরামর্শ: ক্ষেত্রটি তারিখ টাইমের ক্ষেত্রে পরিবর্তন করুন it


4

হাই এই ক্যোয়ারী আমার পক্ষে কাজ করে,

select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'

2
select * from person where DATE(dob) between '2011-01-01' and '2011-01-31'

আশ্চর্যজনকভাবে এই ধরণের রূপান্তরগুলি MySQL এর অনেক সমস্যার সমাধান many


10
আশ্চর্যের বিষয় হল, গ্রহণযোগ্য উত্তরটি (এবং আরও বেশ কয়েকজন) ঠিক এটিই বলেছিল ... আপনি করেছিলেন 2 বছর আগে।
ক্রিস বেকার

0

উপরের তারিখটি +1 দিন নির্ধারণ করুন, সুতরাং আপনার ক্ষেত্রে এটি 2011-02-01 এ সেট করুন।


1
এটি 1 ফেব্রুয়ারি ভুলভাবে শূন্য সময় অন্তর্ভুক্ত করবে .... তাই BETWEENএড়ানো উচিত; কিন্তু >=<পরিবর্তে ব্যবহার করা উচিত।
বিস্মৃত

0

আপনি কোয়েরিটি এটি হিসাবে চালাতে পারেন:

select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'

অন্যদের মতো, যদি আপনার তারিখগুলি হার্ডকোড করা থাকে তবে।

অন্যদিকে, তারিখটি যদি অন্য টেবিলে থাকে তবে আপনি একটি দিন যুক্ত করতে পারেন এবং একটি দ্বিতীয় বিয়োগ করতে পারেন (যদি তারিখগুলি দ্বিতীয় / সময় ছাড়া সংরক্ষণ করা হয়), যেমন:

select * from person JOIN some_table ... where dob between some_table.initial_date and (some_table.final_date + INTERVAL 1 DAY - INTERVAL 1 SECOND)

dobফিল্ডে কাস্ট না করা (যেমন স্বীকৃত উত্তরের মতো) এড়িয়ে চলুন , কারণ এটি বিশাল পারফরম্যান্সের সমস্যা তৈরি করতে পারে (যেমন dobক্ষেত্রটিতে একটি সূচক ব্যবহার করতে সক্ষম না হওয়া , ধরে নিই যে এটি রয়েছে)। using index conditionআপনি using whereযদি এরকম কিছু তৈরি করেন DATE(dob)বা কার্যকর করেন তবে কার্যকর হন CAST(dob AS DATE)!


0

মাইএসকিউএলে মানগুলির মধ্যে অন্তর্ভুক্ত থাকে সুতরাং যখন আপনি '2011-01-01' এবং '2011-01-31' এর মধ্যে যাওয়ার চেষ্টা করবেন

তা থেকে অন্তর্ভুক্ত করা হবে 2011-01-01 00:00:00অবধি 2011-01-31 00:00:00 তাই 2011-01-31 আসলে কিছুই যেহেতু তার সময় থেকে যেতে হবে2011-01-31 00:00:00 ~ 2011-01-31 23:59:59

উপরের সীমানার জন্য আপনি এতে পরিবর্তন করতে পারবেন 2011-02-01তবে এটি সমস্ত ডেটা পাওয়া যাবে2011-01-31 23:59:59

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