MySQL
दिनांक और समय संचालन
खोज…
अभी()
Select Now();
वर्तमान सर्वर दिनांक और समय दिखाता है।
Update `footable` set mydatefield = Now();
यह सर्वर के कॉन्फ़िगर किए गए mydatefield
में वर्तमान सर्वर तिथि और समय के साथ फ़ील्ड mydatefield
को अपडेट करेगा, उदा
'2016-07-21 12:00:00'
तिथि अंकगणित
NOW() + INTERVAL 1 DAY -- This time tomorrow
CURDATE() - INTERVAL 4 DAY -- Midnight 4 mornings ago
संग्रहीत mysql प्रश्न दिखाएँ जो 3 से 10 घंटे पहले (180 से 600 मिनट पहले) पूछे गए थे:
SELECT qId,askDate,minuteDiff
FROM
( SELECT qId,askDate,
TIMESTAMPDIFF(MINUTE,askDate,now()) as minuteDiff
FROM questions_mysql
) xDerived
WHERE minuteDiff BETWEEN 180 AND 600
ORDER BY qId DESC
LIMIT 50;
+----------+---------------------+------------+
| qId | askDate | minuteDiff |
+----------+---------------------+------------+
| 38546828 | 2016-07-23 22:06:50 | 182 |
| 38546733 | 2016-07-23 21:53:26 | 195 |
| 38546707 | 2016-07-23 21:48:46 | 200 |
| 38546687 | 2016-07-23 21:45:26 | 203 |
| ... | | |
+----------+---------------------+------------+
MySQL मैनुअल पेज TIMESTAMPDIFF()
।
खबरदार MySQL में अंकगणित CURDATE() + 1
तारीख अंकगणित जैसे भावों का उपयोग करने की कोशिश न करें। यदि आप ओरेकल डाटाबेस उत्पाद के आदी हैं, तो वे आपकी उम्मीद के मुताबिक नहीं लौटते हैं। इसके बजाय CURDATE() + INTERVAL 1 DAY
उपयोग करें।
एक तिथि सीमा के विरुद्ध परीक्षण
हालाँकि, BETWEEN
रेंज ... AND
... का उपयोग करने के लिए बहुत लुभावना है, लेकिन यह समस्याग्रस्त है। इसके बजाय, यह पैटर्न अधिकांश समस्याओं से बचता है:
WHERE x >= '2016-02-25'
AND x < '2016-02-25' + INTERVAL 5 DAY
लाभ:
-
BETWEEN
'समावेशी' है जिसमें अंतिम तिथि या दूसरा भी शामिल है। - यदि आप
DATETIME
पर माइक्रोसेकंड रिज़ॉल्यूशन रखते हैं तो23:59:59
अनाड़ी और गलत है। - यह पैटर्न लीप वर्ष और अन्य डेटा गणना से निपटने से बचता है।
- यह काम करता है कि क्या
x
DATE
,DATETIME
याTIMESTAMP
।
SYSDATE (), अब (), CURDATE ()
SELECT SYSDATE();
यह फ़ंक्शन वर्तमान दिनांक और समय को 'YYYY-MM-DD HH:MM:SS'
या YYYYMMDDHHMMSS
प्रारूप में मान के रूप में लौटाता है, जो इस बात पर निर्भर करता है कि फ़ंक्शन का उपयोग स्ट्रिंग या संख्यात्मक संदर्भ में किया गया है। यह वर्तमान समय क्षेत्र में दिनांक और समय देता है।
SELECT NOW();
यह फ़ंक्शन SYSDATE()
लिए एक पर्याय है।
SELECT CURDATE();
यह फ़ंक्शन 'YYYY-MM-DD'
या YYYYMMDD
प्रारूप में एक मान के रूप में, बिना किसी फ़ंक्शन के वर्तमान दिनांक को लौटाता है, जो इस बात पर निर्भर करता है कि फ़ंक्शन का उपयोग स्ट्रिंग या संख्यात्मक संदर्भ में किया गया है। यह वर्तमान समय क्षेत्र में दिनांक लौटाता है।
दिए गए दिनांक या दिनांक समय अभिव्यक्ति से दिनांक निकालें
SELECT DATE('2003-12-31 01:02:03');
उत्पादन होगा:
2003-12-31
किसी दिनांक और समय की खोज के लिए एक सूचकांक का उपयोग करना
कई वास्तविक दुनिया डेटाबेस तालिकाओं में DATETIME
या TIMESTAMP
स्तंभ मानों के साथ कई पंक्तियाँ होती हैं, जिनमें बहुत समय होता है, जिसमें वर्षों या कई दशक भी शामिल हैं। अक्सर उस समय के कुछ सबसेट को पुनः प्राप्त करने के लिए WHERE
क्लॉज का उपयोग करना आवश्यक होता है। उदाहरण के लिए, हम तालिका से दिनांक 1-सितंबर -2016 के लिए पंक्तियों को पुनः प्राप्त करना चाह सकते हैं।
ऐसा करने का एक अक्षम तरीका है:
WHERE DATE(x) = '2016-09-01' /* slow! */
यह अक्षम है क्योंकि यह एक फ़ंक्शन - DATE()
- एक कॉलम के मानों पर लागू होता है। इसका मतलब है कि MySQL को x
प्रत्येक मान की जांच करनी चाहिए, और एक इंडेक्स का उपयोग नहीं किया जा सकता है।
ऑपरेशन करने का एक बेहतर तरीका यह है
WHERE x >= '2016-09-01'
AND x < '2016-09-01' + INTERVAL 1 DAY
यह सवाल में दिन पर कहीं भी x
के मूल्यों की एक श्रृंखला का चयन करता है, जब तक कि अगले दिन मध्यरात्रि तक (इसलिए <
) शामिल नहीं होता है।
यदि तालिका में x
कॉलम पर एक इंडेक्स है, तो डेटाबेस सर्वर इंडेक्स पर एक रेंज स्कैन कर सकता है। इसका मतलब है कि यह एक्स के पहले प्रासंगिक मूल्य को जल्दी से पा सकता है, और तब तक अनुक्रमिक रूप से स्कैन कर सकता है जब तक कि यह अंतिम प्रासंगिक मूल्य नहीं पाता है। एक इंडेक्स रेंज स्कैन DATE(x) = '2016-09-01
द्वारा आवश्यक पूर्ण टेबल स्कैन की तुलना में बहुत अधिक कुशल है।
इसका उपयोग करने के लिए परीक्षा न करें, भले ही यह अधिक कुशल लगे।
WHERE x BETWEEN '2016-09-01' AND '2016-09-01' + INTERVAL 1 DAY /* wrong! */
इसमें रेंज स्कैन की तरह ही दक्षता है, लेकिन यह 2-सेप्ट -2016 की आधी रात को x
मूल्यों के साथ पंक्तियों का चयन करेगा, जो कि आप नहीं चाहते हैं।