মাইএসকিউএল DATETIME ক্ষেত্রের স্ট্রিংয়ের সাথে DATE স্ট্রিংয়ের তুলনা করে


94

আমার একটি প্রশ্ন আছে: DATETIME (2010-04-29 10:00) হিসাবে সঞ্চিত স্ট্রিংগুলির সাথে একটি তারিখ স্ট্রিং "2010-04-29" তুলনা করে কি মাইএসকিউএল ডাটাবেস থেকে নির্বাচন করা সম্ভব?

আমার কাছে একটি তারিখ বাছাইকারী রয়েছে যা ডেটা ফিল্টার করে এবং আমি এই জাতীয় ডেটাটাইম ফিল্ডের দ্বারা টেবিলটি জিজ্ঞাসা করতে চাই:

SELECT * FROM `calendar` WHERE startTime = '2010-04-29'"

... এবং আমি "2010-04-29 10:00" এর DATETIME মান থাকা সারিটি পেতে চাই।

কোনও পরামর্শ? ধন্যবাদ

উত্তর:


167

নিম্নলিখিত ব্যবহার:

SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'

কেবলমাত্র রেফারেন্সের জন্য আমার কাছে 2 মিলিয়ন রেকর্ড টেবিল রয়েছে, আমি একই জাতীয় কোয়েরি চালিয়েছি। সলিলের উত্তর 4.48 সেকেন্ড সময় নিয়েছে, উপরেরটি 2.25 সেকেন্ড সময় নিয়েছে।

টেবিলটি বড় হলে আমি এটির পরিবর্তে পরামর্শ দেব।


8
প্রথম উত্তরটি এত ধীর, কারণ তুলনার আগে এটি প্রতিটি ডেটটাইমকে স্ট্রিংয়ে ফর্ম্যাট করতে হয়। আপনারা আরও ভাল, কারণ এটি সরাসরি ক্ষেত্রের কেবলমাত্র তারিখের অংশের সাথে তুলনা করে, তবে এটি এখনও সূচকটি ব্যবহার করতে পারে না (
মাইএসকিএল

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

4
এই জিজ্ঞাসাটি startTimeসূচকযুক্ত হলে সূচক ব্যবহার করতে সক্ষম হবে না ।
জাম্রনি পি। জুহারা

44

আপনি যদি সমস্ত সারি নির্বাচন করতে চান যেখানে DATETIME কলামের DATE অংশটি একটি নির্দিষ্ট আক্ষরিক সাথে মেলে তবে আপনি এটি এর মতো করতে পারবেন না:

WHERE startTime = '2010-04-29'

কারণ মাইএসকিউএল একটি তারিখ এবং একটি DATETIME সরাসরি তুলনা করতে পারে না। মাইএসকিউএল যা করে, এটি প্রদত্ত তারিখের আক্ষরিক সময় '00: 00: 00 'এর সাথে প্রসারিত করে। সুতরাং আপনার অবস্থা হয়ে যায়

WHERE startTime = '2010-04-29 00:00:00'

অবশ্যই আপনি যা চান না!

শর্তটি একটি ব্যাপ্তি এবং তাই এটি পরিসীমা হিসাবে দেওয়া উচিত। বিভিন্ন সম্ভাবনা রয়েছে:

WHERE startTime BETWEEN '2010-04-29 00:00:00' AND '2010-04-29 23:59:59'
WHERE startTime >= '2010-04-29' AND startTime < ('2010-04-29' + INTERVAL 1 DAY)

প্রথমটি ভুল হওয়ার পক্ষে একটি ছোট্ট সম্ভাবনা রয়েছে - যখন আপনার DATETIME কলামটি সাবসেকেন্ড রেজোলিউশন ব্যবহার করে এবং সেখানে 23:59:59 + অ্যাপসিলন এ অ্যাপয়েন্টমেন্ট থাকে। সাধারণভাবে আমি দ্বিতীয় রূপটি ব্যবহার করার পরামর্শ দিই।

উভয় ভেরিয়েন্টগুলি স্টার্টটাইমে একটি সূচক ব্যবহার করতে পারে যা টেবিলটি বড় হওয়ার পরে গুরুত্বপূর্ণ হয়ে উঠবে।


9
ডেভিডের সংস্করণটি ভাল নয়, এটি সূচকগুলি ব্যবহার করতে পারে না। একটি সূচক ব্যবহার করতে, আপনাকে সরাসরি কলামে ফিল্টার আছে, একটি ফাংশন (ফলে না date(), year(), datediff()বা কোনো অনুরূপ)
Marki555

আমি খুঁজছিলাম যে কীভাবে mysql তারিখটিকে তারিখের সময় রূপান্তর করে, এটি পরিষ্কার করার জন্য ধন্যবাদ 00:00:00। এখন আমার ফলাফলগুলি
হিসাবরক্ষক

4
এটি অন্যান্য উত্তরের তুলনায় সঠিক দ্রুত সমাধান যা উপলভ্য হলে সূচক ব্যবহার করতে পারে না
জামারনি পি। জুহারা

24
SELECT * FROM `calendar` WHERE DATE_FORMAT(startTime, "%Y-%m-%d") = '2010-04-29'"

বা

SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'

25
এটি একটি ভয়ানক প্রশ্ন query এটিকে যেকোন মূল্যে এড়িয়ে চলুন। যদি স্টার্টটাইমে কোনও সূচক থাকে তবে এটি এই ক্যোয়ারীটি ব্যবহার করা যাবে না, কারণ এটি কলামে সরাসরি ব্যবহার না করে এটি কোনও ফাংশন প্রয়োগ করছে। এর অর্থ এর মতো যে কোনও প্রশ্নের জন্য একটি পূর্ণ টেবিল স্ক্যান প্রয়োজন। একটি বড় টেবিলের অর্থ এটি একটি অত্যন্ত ধীর কোয়েরি।
স্টিভায়ার

আমি সম্মত, তার উত্তরটি ভুল - সঠিক উত্তরটি নীচে ডেভিড পোস্ট করেছেন।
mindplay.dk

4
দয়া করে, ডেভিডের উত্তরটি ব্যবহার করুন, কারণ এটি আরও দ্রুত। এইটি বৈধ, তবে গতির পক্ষে ভাল নয় ...
xarlymg89

4
@ কার্লোস অ্যালবার্টো মার্টনেজগাদিয়া এই সংস্করণটি ধীর গতির কারণ তুলনার আগে এটি প্রতিটি মানকে স্ট্রিংয়ে ফর্ম্যাট করতে হয় ... ডেভিডের সংস্করণটির প্রয়োজন হয় না তবে তবুও সূচকগুলি ব্যবহার করতে পারে না, তাই এটি অনুকূল নয়। সূচকটি ব্যবহার করতে পারে এমন কোনও সংস্করণের জন্য XL_ এর উত্তর দেখুন। দুর্ভাগ্যক্রমে এটি mysql এ সঠিকভাবে করার আর কোনও উপায় নেই
Marki555

4
আমি এই উত্তরটিকে অগ্রাহ্য করেছি কারণ ক্যোয়ারীটি কোনও সূচক ব্যবহার করতে পারে না, যখন @ এক্সএল_ এর উত্তর দেয়।
পেড্রোমোনেল

2
SELECT * FROM sample_table WHERE last_visit = DATE_FORMAT('2014-11-24 10:48:09','%Y-%m-%d %H:%i:%s')

এটি মাইএসকিএল-তে ডেটটাইম ফর্ম্যাট ব্যবহার করে DATE_FORMAT(date,format)


1
SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29';

এটি সাহায্য করে, আপনি DATEতুলনার আগের মতো মানগুলি রূপান্তর করতে পারেন ।


0

আপনি এই তারিখ হিসাবে DATETIME ফিল্ডটি কাস্ট করতে পারেন:

SELECT * FROM `calendar` WHERE CAST(startTime AS DATE) = '2010-04-29'

এটি খুব কার্যকর।


4
না এটা খুব দক্ষ হয় না। ইনডেক্স করা থাকলে startTimeএটি সূচকটি ব্যবহার করতে সক্ষম হবে না
জাম্রনি পি। জুহারা

-6
SELECT * FROM `calendar` WHERE startTime like '2010-04-29%'

আপনি যদি এর আগে বা আগে কিছু খুঁজে পেতে চান তবে আপনি মাইএসকিউএল তারিখে তুলনা অপারেটরগুলিও ব্যবহার করতে পারেন। এর কারণ এগুলি এ জাতীয়ভাবে লেখা হয়েছে (শীর্ষস্থানীয় শূন্যগুলির সাথে ক্ষুদ্রতম থেকে বৃহত্তর মান) যে একটি সাধারণ স্ট্রিং বাছাই তাদের সঠিকভাবে বাছাই করে।

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