ডেটটাইম কলাম থেকে তারিখটি কীভাবে নির্বাচন করবেন?


238

আমার কাছে 2009-10-20 10:00:00 এর মতো মানগুলির সাথে "ডেটটাইম" টাইপের একটি কলাম রয়েছে

আমি তারিখের সময় থেকে তারিখটি বের করতে এবং একটি কোয়েরি লিখতে চাই:

SELECT * FROM 
data 
WHERE datetime = '2009-10-20' 
ORDER BY datetime DESC

নিম্নলিখিতটি কি এটি করার সর্বোত্তম উপায়?

SELECT * FROM 
data 
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC

এটি তবে একটি খালি ফলাফলসেট দেয়। কোনও পরামর্শ?

উত্তর:


456

আপনি মাইএসকিউএল এর DATE()ফাংশন ব্যবহার করতে পারেন :

WHERE DATE(datetime) = '2009-10-20'

আপনি এটি চেষ্টা করতে পারেন:

WHERE datetime LIKE '2009-10-20%'

ব্যবহারের পারফরম্যান্সের প্রভাব সম্পর্কে তথ্যের জন্য এই উত্তরটি দেখুন LIKE


2
এটি ব্যবহার করে দেখুন: যেখানে তারিখ (তারিখের সময়) = '২০০৯-১০-২০১৮' রয়েছে, এটি কাজ করে
mysqllearner

44
প্রথমটি খুব ধীর এবং সূচকগুলি উপেক্ষা করে।
লাইকের

কোথায় তারিখ (তারিখের সময়) '% কীওয়ার্ড%' এর কাজ পছন্দ, ধন্যবাদ
সিলভিয়া জুলিনকা

2
আমি বিশ্বাস করি যে এটিগুলি যেমন প্রত্যাশা অনুযায়ী কাজ করে না যদি রেলগুলির সময় অঞ্চলটি ইউটিসি ব্যতীত অন্য কিছু হয়। এটি হ'ল তারিখ () কলাম মানটি ইউটিসি-তে সমাধান করে। সুতরাং "শুক্র, 30 ডিসেম্বর 2016 00:00:00 এসজিটি +08: 00" এর মতো একটি তারিখ যা আমরা "2016-12-30" এর জন্য জিজ্ঞাসা করেছিলাম কিনা তা খুঁজে পেতে আশা করি। কেন? কারণ তারিখ () এটি তুলনা করার আগে এটির ইউটিসি সমতুল্য সমাধান করবে, যা "2016-12-29 16:00:00 ইউটিসি"। আমি ভুল হলে আমাকে সংশোধন করুন কারণ এটিও আমার কাছে অতি সম্প্রতি ছিল।
টিকিবয়

কোথায় তারিখ (তারিখের সময়) = 's? Sdate a একটি স্ফটিক প্রতিবেদন প্যারামিটার জন্য পুরোপুরি কাজ করে! চমৎকার কাজ!
মাইকমাইটি

94

ব্যবহার WHERE DATE(datetime) = '2009-10-20' কর্মক্ষমতা বিষয় আছেএখানে যেমন বলা হয়েছে :

  • এটি DATE()মেলে না এমনগুলি সহ সমস্ত সারিগুলির জন্য গণনা করবে ।
  • এটি ক্যোয়ারির জন্য একটি সূচক ব্যবহার করা অসম্ভব করে তুলবে।

ব্যবহার করুন BETWEENঅথবা >, <, =অপারেটার যা একটি সূচক ব্যবহার করার অনুমতি দেয়:

SELECT * FROM data 
WHERE datetime BETWEEN '2009-10-20 00:00:00' AND '2009-10-20 23:59:59'

আপডেট করুন: প্রভাব ব্যবহার করে LIKEএকটি সূচীবদ্ধ কলামে অপারেটরদের পরিবর্তে উচ্চ । 1,176,000 সারি সহ এটি একটি টেবিলে কিছু পরীক্ষার ফলাফল:

  • datetime LIKE '2009-10-20%'=> 2931ms ব্যবহার করে using
  • datetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'=> 168ms ব্যবহার করে using

একই ক্যোয়ারিতে দ্বিতীয় কল করার সময় পার্থক্যটি আরও বেশি হয়: 2984ms বনাম 7 এসএম (হ্যাঁ, মাত্র 7 মিলিসেকেন্ড!)। হাইবারনেট ব্যবহার করে কোনও প্রকল্পে কিছু পুরানো কোডটি পুনরায় লেখার সময় আমি এটি পেয়েছি।


আকর্ষণীয়, মাইএসকিএল বাস্তবায়ন যদি স্বয়ংক্রিয়ভাবে দৃশ্যে বেহিনে রূপান্তরিত DATE(datetime)হয় BETWEEN AND তবে আমরা সংক্ষিপ্ত বিবৃতি এবং শীতল পরিবেশনা পাই get কেন না? কেন তারা এ কাজ করেনি? :)
চেরি

কারণ এর মতো কিছু DATE(datetime) in (:list)কাজ করে নাBETWEEN
টিম

25

আপনি ডেটটাইমটি ওয়াইএমডি অংশে ফর্ম্যাট করতে পারেন:

DATE_FORMAT(datetime, '%Y-%m-%d')

2
এবং এইভাবে আপনি প্রয়োজন হলে কেবল সময়ের অংশ পেতে পারেন:DATE_FORMAT(datetime, '%H:%i:%S')
মেটাফানিয়েল

এটি ডেটটাইম গঠনে দুর্দান্ত কাজ করে তবে বিনিময়ে ডাটাবেসটির জন্য নামটি সেট করার জন্য একটি নতুন অ্যারে ফিরে আসবে কেবলমাত্র DATE_FORMAT (কলামনাম, '% Y-% m-% d') অ্যারে নেমে আরও বিশদ পরীক্ষা করার জন্য অ্যারে নাম লিখুন ডকুমেন্টেশনগুলি dev.mysql.com/doc/refman/8.0/en/…
রিধা রেজ্জাগ

15

যদিও পৃষ্ঠায় সমস্ত উত্তর পছন্দসই ফলাফলটি ফিরিয়ে দেবে, তবে তাদের সকলের পারফরম্যান্সের সমস্যা রয়েছে। ধারাটিতে ক্ষেত্রগুলিতে কখনই গণনা সম্পাদন করবেন না WHERE(কোনও DATE()গণনা সহ ) যে সারণীতে সমস্ত সারিতে গণনা করা আবশ্যক।

দ্য BETWEEN ... ANDকনস্ট্রাক্ট নিজেই অন্যান্য বিষয় (মাইক্রোসেকেন্ড লেনদেন, যা আমি বিশ্বাস করি মাইএসকিউএল 2009 সালে সমর্থন দেয়নি যখন প্রশ্ন জিজ্ঞাসা করা হল) আছে যা শেষ তারিখে 23:59:59 সিনট্যাক্স নির্দিষ্ট করার এক প্রয়োজন উভয় সীমান্ত অবস্থার জন্য সমেত।

timestampকোনও নির্দিষ্ট দিনের জন্য মাইএসকিউএল ক্ষেত্রটি অনুসন্ধান করার সঠিক উপায়টি হ'ল গ্রেটার-থান-ইকুয়ালগুলির জন্য পছন্দসই তারিখের বিপরীতে পরীক্ষা করা এবং পরের দিনটি তার চেয়ে কম সময় নির্ধারণ করা উচিত no

WHERE datetime>='2009-10-20' AND datetime<'2009-10-21'

এটি দ্রুততম সঞ্চালনকারী, সর্বনিম্ন-স্মৃতিশক্তি, স্বল্প-সংস্থান-সংস্থান নিবিড় পদ্ধতি এবং অতিরিক্তভাবে সমস্ত মাইএসকিউএল বৈশিষ্ট্য এবং কর্নার-কেস যেমন সাব-সেকেন্ড টাইমস্ট্যাম্প যথার্থতা সমর্থন করে। অতিরিক্তভাবে, এটি ভবিষ্যতের প্রমাণ।


1
এবং, আপনার পারফরম্যান্স আর্গুমেন্টটি ব্যবহার করে, "> =" এবং "<" কি টেবিলের প্রতিটি সারিতে সমানভাবে গণনা করা হয়, বা এসকিউএল সার্ভারটি কেবল "জাদুকরীভাবে" জানেন যে কোনও সংখ্যাটি অন্যের চেয়ে বড় কিনা? :-)
জাভিয়ের গেরেরো

@ জাভিয়ারগেরেরো: আমার উদাহরণটি দুটি স্থির সাথে তুলনা করেছে: একটি টেবিল থেকে এবং একটি স্ট্রিং আক্ষরিক।
dotancohen

"টেবিল থেকে একটি" একটি ধ্রুবক নয়, এটি প্রতিটি সারির জন্য পরিবর্তিত হয়, সুতরাং প্রতিটি সারির জন্য একই গণনা করাতে হবে (এবং উভয়ই তুলনা সম্পাদনের জন্য যুগের সময় রূপান্তর করতে হবে)
জাভিয়ের গেরেরো

9

এখানে সমস্ত ফর্ম্যাট আছে

বলুন এটি হ'ল কলামটিতে datetimeমান, টেবিল রয়েছে data

+--------------------+
| date_created       |
+--------------------+
| 2018-06-02 15:50:30|
+--------------------+

mysql> select DATE(date_created) from data;
+--------------------+
| DATE(date_created) |
+--------------------+
| 2018-06-02         |
+--------------------+

mysql> select YEAR(date_created) from data;
+--------------------+
| YEAR(date_created) |
+--------------------+
|               2018 |
+--------------------+

mysql> select MONTH(date_created) from data;
+---------------------+
| MONTH(date_created) |
+---------------------+
|                   6 |
+---------------------+

mysql> select DAY(date_created) from data;
+-------------------+
| DAY(date_created) |
+-------------------+
|                 2 |
+-------------------+

mysql> select HOUR(date_created) from data;
+--------------------+
| HOUR(date_created) |
+--------------------+
|                 15 |
+--------------------+

mysql> select MINUTE(date_created) from data;
+----------------------+
| MINUTE(date_created) |
+----------------------+
|                   50 |
+----------------------+

mysql> select SECOND(date_created) from data;
+----------------------+
| SECOND(date_created) |
+----------------------+
|                   31 |
+----------------------+

5

তুমি ব্যবহার করতে পার:

DATEDIFF ( day , startdate , enddate ) = 0

বা:

DATEPART( day, startdate ) = DATEPART(day, enddate)
AND 
DATEPART( month, startdate ) = DATEPART(month, enddate)
AND
DATEPART( year, startdate ) = DATEPART(year, enddate)

বা:

CONVERT(DATETIME,CONVERT(VARCHAR(12), startdate, 105)) = CONVERT(DATETIME,CONVERT(VARCHAR(12), enddate, 105))

5

তারিখ ফাংশন ব্যবহার করার সহজ এবং সর্বোত্তম উপায়

উদাহরণ

SELECT * FROM 
data 
WHERE date(datetime) = '2009-10-20' 

অথবা

SELECT * FROM 
data 
WHERE date(datetime ) >=   '2009-10-20'  && date(datetime )  <= '2009-10-20'

-5

ভাল, LIKEবিবৃতিতে ব্যবহার করা সর্বোত্তম বিকল্প যা WHERE datetime LIKE '2009-10-20%' এটি এই ক্ষেত্রে কাজ করা উচিত

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