Mysql में वर्तमान डेटाटाइम से 30 दिन कैसे घटाएं?


195

मैं mysql में वर्तमान डेटाटाइम से 30 दिन कैसे घटाऊँ?

SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();

जवाबों:



128

जो कोई भी उपयोग नहीं करना चाहता है DATE_SUB, उसका उपयोग करें CURRENT_DATE:

SELECT CURRENT_DATE - INTERVAL 30 DAY

2
अगर मैं कर सकता तो मैं यह +10 देता। SQL सभी पठनीयता के बारे में होना चाहिए और ऐसा करने के लिए यह सबसे पठनीय तरीका है।
कॉलिन की टी हार्ट

9
उपयोग करने की तुलना में अधिक पठनीय लेकिन अलग परिणाम NOW() - INTERVAL 30 DAY। चूँकि प्रश्न "वर्तमान डेटाइम से 30 दिनों को घटाता है" का उल्लेख करता है , इसलिए यह वह नहीं हो सकता जो ओपी चाहता है।
ypercube y

2
@ ypercube y के current_timestampबजाय का उपयोग करेंcurrent_date
isapir

21

NOW()जैसे आप किसी भी क्वेरी कैशिंग या ऑप्टिमाइज़ेशन को खो रहे हैं, उसका उपयोग न करें क्योंकि क्वेरी हर बार अलग होती है। उन कार्यों की सूची देखें जिन्हें आपको MySQL प्रलेखन में उपयोग नहीं करना चाहिए ।

नीचे दिए गए कोड में, मान लें कि यह तालिका समय के साथ बढ़ रही है। नया सामान जोड़ा गया है और आप पिछले 30 दिनों में सिर्फ सामान दिखाना चाहते हैं। यह सबसे आम मामला है।

ध्यान दें कि तारीख को एक स्ट्रिंग के रूप में जोड़ा गया है। अपने कॉलिंग कोड से इस तरह से तारीख जोड़ना बेहतर है, NOW()क्योंकि यह आपके कैशिंग को मारता है।

SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);

आप उपयोग कर सकते हैं BETWEENयदि आप वास्तव में इस बहुत सेकंड से 30 से 30 दिन पहले सामान चाहते हैं, लेकिन यह मेरे अनुभव में एक सामान्य उपयोग का मामला नहीं है, तो मुझे उम्मीद है कि सरलीकृत क्वेरी आपको अच्छी सेवा दे सकती है।


3
इसलिए आपने कोई उपयोग नहीं करने का प्रस्ताव रखा NOW()और फिर भी अपने उत्तर में इसका उपयोग करें। o_O PS: आपकी क्वेरी एक और परिणाम
लौटाएगी

@zerkms यह क्वेरी आपकी क्वेरी से भिन्न परिणाम कैसे सेट करेगी?
user784637

2
@ user784637: उह, BETWEENऔर >=विभिन्न ऑपरेटर हैं, आप जानते हैं? मेरी क्वेरी 30 days ago AND todayइस के लिए निर्धारित परिणाम को सीमित करती है everything after 30 days ago। इसलिए tomorrowरिकॉर्ड मेरा और आपकी मूल क्वेरी के लिए मेल नहीं खाएंगे, लेकिन इस जवाब से मेल
खाएंगे

ठीक है, मेरा बुरा। आमतौर पर ऐसे प्रश्न लाइव टेबल में होते हैं जो समय के साथ बढ़ रहे हैं। इसीलिए मैंने बीच में गिरा दिया। मैंने अपना उत्तर स्पष्ट कर दिया है।
जोसेफ वासना

@ JosephLust, प्रदर्शन समस्याओं को हल करने के लिए, मेरे समाधान का उपयोग करें।
पचेरियर

17

MySQL अब से दिन घटाएँ:

select now(), now() - interval 1 day

प्रिंटों:

2014-10-08 09:00:56     2014-10-07 09:00:56

अन्य अंतराल अस्थायी अभिव्यक्ति इकाई तर्क:

https://dev.mysql.com/doc/refman/5.5/en/expressions.html#temporal-intervals

select now() - interval 1 microsecond 
select now() - interval 1 second 
select now() - interval 1 minute 
select now() - interval 1 hour 
select now() - interval 1 day 
select now() - interval 1 week 
select now() - interval 1 month 
select now() - interval 1 year 


1
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')

आप एसक्यूएल में दिनांक प्रारूप का उपयोग करके प्रारूपित कर सकते हैं।


0

दूसरा रास्ता

SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;

0

यदि आपको केवल दिनांक की आवश्यकता है, न कि समय उपयोग की:

select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();

चूंकि curdate()समय घटक को छोड़ दिया जाए, तो यह संभावित रूप से now()उन मामलों में "शब्दार्थिक रूप से सही" की तुलना में अधिक तेज है जहां आप केवल तारीख में रुचि रखते हैं।

इसके अलावा, subdate()2-धमनी अधिभार संभावित रूप से उपयोग करने की तुलना में तेज है intervalintervalउन मामलों के लिए होता है जब आपको एक गैर-दिन घटक की आवश्यकता होती है।


11
तो, आप दावा कर रहे हैं कि subdate(curdate(), 30)यह किसकी तुलना में घातक है CURRENT_DATE - INTERVAL 30 DAY? क्या आपके पास सबूत है? और कितनी तेजी से होगा? कुछ माइक्रोसेकंड?
ypercube y

2
मुझे पता नहीं है। मैं निश्चित रूप से अपनी टिप्पणियों को बढ़ा नहीं सकता। "संभावित" तेज दावे के बारे में, मुझे अभी भी कोई सबूत, निर्णायक या परिस्थितिजन्य नहीं दिखाई देता है। और यहां तक ​​कि अगर यह कुछ हद तक तेज है, तो स्थिति का मूल्यांकन एक बार किया जाएगा। जब तक आप प्रति मिनट लाखों बार क्वेरी नहीं चलाते, तब तक फर्क नहीं पड़ेगा।
ypercube y

2
मैं अनुमान लगा रहा हूं कि subdateतेजी से संभावित रूप से किसी भी तरह से समझाया जा सकता है, आपकी राय में, इसके "2-एरिटी ओवरलोड" द्वारा, लेकिन, कृपया मुझे माफ कर दें अगर यह एक बेवकूफ सवाल है, तो उन शब्दों का क्या मतलब है (एक फ़ंक्शन के संबंध में) )? विशेष रूप से, "2-आरती" क्या है?
एंड्री एम

1
इसके अलावा, जहां तक ​​सवाल का शब्दांकन है, curdate()वास्तव में गलत विकल्प हो सकता है, क्योंकि ओपी को "मौजूदा डेटाइम से 30 दिन घटाना " (जोर मेरा) लगता है।
एंड्री एम

1
@AndriyM, खैर जब से इस धागे को 50k बार देखा जा रहा है, मैं यहां उन लोगों के लिए जवाब छोड़ दूंगा जो केवल समय घटक में रुचि रखते हैं। और "एरीटी" के बारे में, यह तर्कों की संख्या की बात कर रहा है । हां यह सही है, सभी चीजों के बराबर होने के लिए, एक 2-एरिटी फंक्शन संभावित रूप से 3-एरिटी वन की तुलना में तेज है। यह तब तक सही रहेगा जब तक कि नई जानकारी को प्लेट में नहीं जोड़ा जाता।
पचेरियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.