डेटाइम कॉलम से तारीख का चयन कैसे करें?


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

आप MySQL के DATE()फ़ंक्शन का उपयोग कर सकते हैं :

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

आप यह भी आज़मा सकते हैं:

WHERE datetime LIKE '2009-10-20%'

उपयोग करने के प्रदर्शन निहितार्थ के बारे में जानकारी के लिए यह उत्तर देखें LIKE


2
यह एक कोशिश की: जहाँ DATE (
डेटाइम

44
पहला वाला बहुत धीमा है और इंडेक्स को नजरअंदाज करता है। यह बेहतर है कि LIKE 'डेट%'
kachar

DATE (डेटाइम) LIKE '% कीवर्ड%' को इसके कार्य करने के लिए, धन्यवाद
silvia zulinka

2
मेरा मानना ​​है कि यह अपेक्षा के अनुरूप काम नहीं करता है यदि रेल टाइमजोन यूटीसी के अलावा कुछ और है। ऐसा इसलिए है क्योंकि DATE () UTC के कॉलम मान को हल करता है। तो "शुक्र, 30 दिसंबर 2016 00:00:00 एसजीटी +08: 00" जैसी तारीख जो हमें उम्मीद है कि अगर हम "2016-12-30" के लिए बोली लगाते हैं तो नहीं मिलेगी। क्यों? क्योंकि DATE () इसकी तुलना यूटीसी समकक्ष करने से पहले करेगा, जो कि "2016-12-29 16:00:00 यूटीसी" है। मुझे सही करें अगर मैं गलत हूं क्योंकि यह हाल तक मेरे लिए भी एक गोचरा था।
तिकिबोय

DATE (डेटाटाइम) = '{? Sdate} क्रिस्टल रिपोर्ट पैरामीटर के लिए पूरी तरह से काम करता है! अच्छा काम!
माइकमैटी

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%'=> 2931 मी
  • उपयोग datetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'=> 168ms

जब एक ही क्वेरी पर दूसरा कॉल करना अंतर अधिक होता है: 2984ms बनाम 7ms (हाँ, सिर्फ 7 मिलीसेकंड!)। मैंने हाइबरनेट का उपयोग करते हुए एक परियोजना पर कुछ पुराने कोड को फिर से लिखते हुए पाया।


दिलचस्प है, अगर MySql कार्यान्वयन स्वचालित रूप DATE(datetime)से BETWEEN AND उन दृश्यों को बेहरीन करने के लिए धर्मान्तरित हो जाता है जो हमें छोटे बयान और शांत प्रदर्शन मिलते हैं। क्यों नहीं? उन्होंने ऐसा क्यों नहीं किया? :)
चेरी

क्योंकि कुछ ऐसा DATE(datetime) in (:list)काम नहीं करता हैBETWEEN
टिम

25

आप YMD भाग में डेटाइम को प्रारूपित कर सकते हैं:

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

यद्यपि पृष्ठ पर सभी उत्तर वांछित परिणाम लौटाएंगे, लेकिन वे सभी प्रदर्शन के मुद्दे हैं। खंड ( गणना सहित ) में फ़ील्ड पर गणना कभी न करें क्योंकि गणना तालिका में सभी पंक्तियों पर की जानी चाहिए।WHEREDATE()

BETWEEN ... ANDनिर्माण ही अन्य मुद्दों (माइक्रोसेकंड लेनदेन, जो मेरा मानना है कि MySQL 2009 में समर्थन नहीं किया जब प्रश्न पूछा गया था) है जो अन्त तिथि पर 23:59:59 वाक्य रचना निर्दिष्ट करने के लिए एक की आवश्यकता होती है दोनों सीमा की स्थिति के लिए समावेशी है,।

timestampकिसी विशेष दिन के लिए एक MySQL फ़ील्ड को क्वेरी करने का उचित तरीका है कि वांछित तिथि के विरुद्ध ग्रेटर-थन-इक्वल के लिए जाँच करें, और उसके बाद के दिन के लिए कम-थान निर्दिष्ट नहीं है।

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

यह सबसे तेज़ प्रदर्शन करने वाली, सबसे कम-मेमोरी, कम से कम संसाधन गहन विधि है, और इसके अलावा सभी MySQL सुविधाओं और कोने-मामलों जैसे उप-सेकंड टाइमस्टैम्प परिशुद्धता का समर्थन करता है। इसके अतिरिक्त, यह भविष्य का प्रमाण है।


1
और, अपने प्रदर्शन तर्क का उपयोग करते हुए, "> =" और "<" समान रूप से तालिका की प्रत्येक पंक्ति पर गणना की जाती है, या SQL सर्वर सिर्फ "जादुई रूप से" जानता है कि क्या एक संख्या अन्य की तुलना में अधिक है? :-)
जेवियर ग्युरेरो

@JavierGuerrero: मेरा उदाहरण दो स्थिरांक की तुलना करता है: एक मेज से और एक स्ट्रिंग शाब्दिक।
डॉटनचेन

"टेबल से एक" एक स्थिर नहीं है, यह प्रत्येक पंक्ति के लिए भिन्न होता है, इसलिए प्रत्येक पंक्ति के लिए एक ही गणना की जाती है (और साथ ही, दोनों को तुलना करने के लिए युगांतर के समय में बदलना पड़ता है)
जेवियर गेरेरो

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%' है जो इस मामले में काम करना चाहिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.