2011-10-28 13 views
7

के समान दिनांक DATETIME का चयन करें, मुझे दो तालिकाओं के बीच एक ही समय के सापेक्ष परिणामों को कम करना होगा, लेकिन टाइम स्टैंप कुछ सेकंड के अलग होने के कारण अलग-अलग होते हैं। मैं परिणाम प्राप्त करना चाहता हूं जैसे उदाहरण 1 लेकिन मुझे केवल उदाहरण 2 में तारों के साथ मूल्य मिलते हैं। तुलना से सेकेंड को हटाने का सबसे अच्छा तरीका क्या है, या निकटतम DATETIME मान से संबंधित मान का चयन करने का सबसे अच्छा तरीका क्या है?MySQL मिनट

SELECT Table1.TimeSTamp1, Table1.Param1, Table2.TimeStamp2, Table2.Param2 
    FROM Table1, Table2 
    WHERE ... conditions for the other parameters of Table1 and Table2... 
    AND Table1.TimeSTamp1 = Table2.TimeStamp2 

सबसे अच्छा अभ्यास पर कोई भी सुझाव गरमी का स्वागत किया जाता है:

वर्तमान में मैं इस क्वेरी का उपयोग कर रहा हूँ।


उदाहरण 1

TimeStamp1   ¦ Param1 ¦ TimeStamp2   ¦ Param2 
2011-01-01 00:00:35 ¦ 1  ¦ 2011-01-01 00:00:35 ¦ a  * 
2011-01-01 00:01:35 ¦ 2  ¦ 2011-01-01 00:01:35 ¦ b 
2011-01-01 00:02:37 ¦ 3  ¦ 2011-01-01 00:02:35 ¦ c 
2011-01-01 00:03:31 ¦ 4  ¦ 2011-01-01 00:03:35 ¦ d 
2011-01-01 00:04:32 ¦ 5  ¦ 2011-01-01 00:04:35 ¦ e 
2011-01-01 00:05:38 ¦ 6  ¦ 2011-01-01 00:05:35 ¦ f 
2011-01-01 00:06:36 ¦ 7  ¦ 2011-01-01 00:06:36 ¦ g  * 
2011-01-01 00:07:32 ¦ 8  ¦ 2011-01-01 00:07:35 ¦ h 
2011-01-01 00:08:33 ¦ 9  ¦ 2011-01-01 00:08:35 ¦ i 
2011-01-01 00:09:33 ¦ 10  ¦ 2011-01-01 00:09:33 ¦ l  * 
2011-01-01 00:10:35 ¦ 11  ¦ 2011-01-01 00:10:35 ¦ m  * 
2011-01-01 00:11:29 ¦ 12  ¦ 2011-01-01 00:11:31 ¦ n 

एल एल एल उदाहरण 2

TimeStamp1   ¦ Param1 ¦ TimeStamp2   ¦ Param2 
2011-01-01 00:00:35 ¦ 1  ¦ 2011-01-01 00:00:35 ¦ a 
2011-01-01 00:06:36 ¦ 7  ¦ 2011-01-01 00:06:36 ¦ g 
2011-01-01 00:09:33 ¦ 10  ¦ 2011-01-01 00:09:33 ¦ l 
2011-01-01 00:10:35 ¦ 11  ¦ 2011-01-01 00:10:35 ¦ m 

उत्तर

10

यह MySql अभिव्यक्ति के साथ सेकंड बाहर ध्यान केंद्रित किया तुम वापस दे देंगे DATETIME मूल्यों।

CONVERT(DATE_FORMAT(table.column,'%Y-%m-%d-%H:%i:00'),DATETIME) 

इस पर एक नज़र डालें। http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format। तो अगर आप इस तरह एक प्रश्न के साथ खत्म हो सकता है:

SELECT Table1.TimeSTamp1, Table1.Param1, Table2.TimeStamp2, Table2.Param2 
    FROM Table1 
    JOIN Table2 ON CONVERT(DATE_FORMAT(Table1.TimeStamp1,'%Y-%m-%d-%H:%i:00'),DATETIME) 
       = CONVERT(DATE_FORMAT(Table2.TimeStamp2,'%Y-%m-%d-%H:%i:00'),DATETIME) 
    WHERE ... conditions for the other parameters of Table1 and Table2... 

लेकिन, सावधान रहना। स्वत: जेनरेटेड टाइमस्टैम्प फ्लोटिंग पॉइंट नंबरों की तरह हैं; जब उनमें से दो एक-दूसरे के बराबर हो जाते हैं तो यह सिर्फ भाग्य है। मिनट में अपने टाइमस्टैम्प को छोटा करना ठीक हो सकता है, लेकिन आप एक टाइमस्टैम्प को दूसरे से घटाकर बेहतर कर सकते हैं, और अंतर (या मतभेदों के पूर्ण मूल्य) की तुलना कर सकते हैं।

इसके अलावा, यह शामिल होने वाला धीमा होने वाला है क्योंकि इसे प्रत्येक मूल्य पर दूसरा-टंकण करने वाला फ़ंक्शन चलाने के लिए है, इसलिए यह किसी भी अनुक्रमणिका का उपयोग नहीं कर सकता है।

आप TIMESTAMPDIFF() के साथ एक टाइमस्टैम्प घटा सकते हैं। लेकिन सावधान रहना। यह फ़ंक्शन केवल एक दूसरे के कुछ दिनों के भीतर टाइमस्टैम्प के लिए सेकंड के स्तर पर सही ढंग से काम करता है; यह gracelessly बहती है (जैसा कि मैंने बहुत दर्द के साथ खोजा)।

आप टाइमस्टैम्प को आपके द्वारा डालने के समय मिनटों में छंटनी करने का प्रयास कर सकते हैं। इससे आपको उन्हें अनुक्रमित करने दिया जाएगा।

+0

धन्यवाद, TIMESTAMPDIFF काम करता है। कभी-कभी मुझे डबल प्रविष्टियां मिलती हैं और उन्हें हटाने में काफी समय लगता है।अगर मैं इस मामले में तारीख को परिवर्तित कर रहा हूं तो मैं परीक्षण करूंगा। –

1
WHERE ... 
AND ABS(UNIX_TIMESTAMP(TimeStamp1) - UNIX_TIMESTAMP(TimeStamp2)) < :threshold: 

जहां threshold जिसके बाद आप अब एक मैच चाहते हैं (उदाहरण के लिए 60 के लिए 1 मिनट) सेकंड की संख्या है।

+0

मैंने कोशिश की लेकिन त्रुटि 2013 तक इसमें बहुत अधिक समय लगता है –

1

आप TIMESTAMPDIFF इस्तेमाल कर सकते हैं सेकंड में datetimes में अंतर की गणना करने के:

SELECT t1.TimeStamp1, t1.Param1, t2.TimeStamp2, t2.Param2 
FROM Table1 t1 
LEFT JOIN Table2 t2 
ON ABS(TIMESTAMPDIFF(SECOND,t1.TimeStamp1,t2.TimeStamp2))<=4 
WHERE ... 

ध्यान देने योग्य बात Ollie Jones warning, मैं MySQL संस्करण 5.1.58 पर TIMESTAMPDIFF परीक्षण किया है और अप करने के लिए से भिन्न टाइम स्टाम्प्स के साथ कोई अतिप्रवाह मिल गया है कम से कम 10000 साल तो शायद यह समस्या तय कर दी गई है।

संबंधित मुद्दे