MySQL में दिनांक-केवल पैरामीटर के साथ टाइमस्टैम्प तिथियों की तुलना कैसे करें?


91

SQL कथन में, मैं YYYY-MM-DD प्रारूप में दिनांक के साथ TIMESTAMP के रूप में सहेजी गई दिनांक की तुलना कैसे करूं?

पूर्व .: SELECT * FROM table WHERE timestamp = '2012-05-25'

मैं चाहता हूं कि यह क्वेरी निर्दिष्ट दिन में टाइमस्टैम्प वाली सभी पंक्तियों को लौटाए, लेकिन यह केवल मध्यरात्रि टाइमस्टैम्प वाली पंक्तियाँ लौटाती है।

धन्यवाद

जवाबों:


150

आप DATE()टाइमस्टैम्प की तिथि भाग निकालने के लिए फ़ंक्शन का उपयोग कर सकते हैं :

SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-25'

हालाँकि, यदि आपके पास टाइमस्टैम्प कॉलम पर एक इंडेक्स है, तो यह तेज़ होगा क्योंकि यह टाइमस्टैम्प कॉलम पर एक इंडेक्स का उपयोग कर सकता है यदि आपके पास एक है:

SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-25 00:00:00' AND '2012-05-25 23:59:59'

6
एक छोटे से परीक्षण के माध्यम से, मैं अभी भागा, मैंने पाया कि BETWEEN को 10X Just FYI के कारक द्वारा तेज किया जा रहा है
DarbyM

1
एक तारीख का उपयोग करें जहां यह स्पष्ट है कि किस संख्या का मतलब किस प्रकार है।
लुकास सालिच


7

जैसा कि कुछ ने सुझाव दिया है, DATE(timestamp)आप का उपयोग करके कॉलम में हेरफेर लागू कर रहे हैं और इसलिए आप सूचकांक आदेश पर भरोसा नहीं कर सकते।

हालाँकि, BETWEENयदि आप मिलीसेकंड को शामिल करते हैं, तो इसका उपयोग केवल विश्वसनीय होगा। उदाहरण टाइमस्टैम्प में BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'आप एक टाइमस्टैम्प के बीच 2012-05-05 23:59:59.001और के साथ रिकॉर्ड को बाहर करते हैं 2012-05-05 23:59:59.999। हालाँकि, इस विधि में भी कुछ समस्याएं हैं, क्योंकि डेटाटाइप्स सटीक है। कभी-कभी 999 मिलीसेकंड गोल होता है।

सबसे अच्छी बात यह है:

SELECT * FROM table
WHERE date>='2012-05-05' AND date<'2012-05-06'

5
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'

2

MYSQL के रूपांतरण फ़ंक्शन का उपयोग करें:

SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05' 

यह काम करना चाहिए


1

जैसा कि मैं इस पर शोध कर रहा था, मैंने सोचा कि किसी विशेष गैर-स्थैतिक / स्ट्रिंग तिथि के लिए एक उदाहरण दिखाने के लिए BETWEEN समाधान को संशोधित करना अच्छा होगा, बल्कि एक चर तारीख, या आज के जैसे CURRENT_DATE()। यह log_timestamp कॉलम पर अनुक्रमणिका का उपयोग करेगा

SELECT *
FROM some_table
WHERE
    log_timestamp
    BETWEEN 
        timestamp(CURRENT_DATE()) 
    AND # Adds 23.9999999 HRS of seconds to the current date
        timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL '86399.999999' SECOND_MICROSECOND));

मैंने अगले दिन 12AM मामले से बचने के लिए सेकंड / माइक्रोसेकंड किया। हालाँकि, आप एक अधिक पाठक के अनुकूल गैर-बीटा दृष्टिकोण के लिए तुलना ऑपरेटरों के माध्यम से `इंटरवल '1 डीएवाई भी कर सकते हैं:

SELECT *
FROM some_table
WHERE
    log_timestamp >= timestamp(CURRENT_DATE()) AND
    log_timestamp < timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY));

ये दोनों दृष्टिकोण सूचकांक का उपयोग करेंगे और तेजी से MUCH का प्रदर्शन करना चाहिए। दोनों समान रूप से तेज प्रतीत होते हैं।


0

यदि आप क्वेरी को चलाने के लिए SQL पैरामीटर का उपयोग कर रहे हैं तो यह मददगार होगा

SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')

0

जब मैंने आपका प्रश्न पढ़ा, तो मुझे लगा कि आप Oracle DB पर हैं जब तक मैंने 'MySQL' टैग नहीं देखा था। वैसे भी, यहाँ Oracle के साथ काम करने वाले लोगों के लिए तरीका है:

SELECT *
FROM table
where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');

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