2012-03-28 18 views
8

तो यहां स्थिति है। मेरी डीबी तालिका में मेरे पास expire_date नामक कॉलम है, जहां मैंने प्रत्येक पंक्ति के लिए एक निश्चित तारीख डाली है। तो उदाहरण के लिए समाप्ति तिथि 28-04-2012php दिनांक -1 महीने

मुझे एक PHP कोड की आवश्यकता है जो एक निश्चित उपयोगकर्ता को ईमेल के माध्यम से एक नोटिस भेजेगा कि उस तारीख को समाप्त होने वाली कुछ चीज़ समाप्त होने से 1 महीने है। तो अगर आज 28-03-2012 है, तो इसका मतलब है कि उस चीज की समयसीमा समाप्त होने से पहले केवल 1 चंद्रमा है। मैंने इसके लिए कोई कोड नहीं बनाया क्योंकि मुझे नहीं पता कि -1 महीने को कैसे हल किया जाए।

उत्तर

13

सबसे पहले उपयोग कर सकते हैं पाने के लिए होना चाहता हूँ है php के साथ एक महीने में की तारीख:

$myDate = date("Y-m-d", strtotime(date("Y-m-d", strtotime(date("Y-m-d"))) . "+1 month")); 

तो फिर तुम एक का चयन कर सकते हैं:

$result = mysql_query('SELECT * FROM myTable WHERE expire_date BETWEEN NOW AND "' . $myDate . '"'); 

और वहां आपके पास एक महीने से भी कम समय में समाप्त होने वाली सभी वस्तुओं के साथ एक सरणी है।

$result = mysql_query('SELECT * FROM myTable WHERE expire_date = "' . $myDate . '"'); 

मुझे आशा है कि इस मदद करता है

+0

धन्यवाद। यह काम कर रहा है! – gogu

+1

@ टेल्स आपको वास्तव में 1 तारीख() फ़ंक्शन का उपयोग करके उसी तारीख को प्राप्त करने में सक्षम होना चाहिए: 'दिनांक (' वाईएम-डी ', स्ट्रेटोटाइम (दिनांक (' वाईएम-डी ')।' +1 महीने ')) ; – OnethingSimple

+1

@ टेल्स असल में, मुझे लगता है कि 'echo date (' ym-d ', strtotime (' + 1 month '));' सही? – OnethingSimple

1
SELECT user, email FROM tbl WHERE expire_date = CURRENT_TIMESTAMP - INTERVAL 1 MONTH 

सूचना है कि मैं = और कम नहीं का उपयोग करें, क्योंकि अगर आप बस की तुलना में यह एक माह से कम नहीं है कि, तो आप उन पिछले महीने के दौरान हर दिन भेज देंगे ।

+0

यह एक महीने पहले समाप्त होने वाले रिकॉर्ड का चयन करता है। –

0

आपको शायद अपनी तिथि स्ट्रिंग को यूनिक्स समय में बदलने की आवश्यकता होगी और फिर एक चुनिंदा डेटिफ़ करें। (मुझे लगता है कि आप एसक्यूएल का उपयोग कर रहे हैं)।

SELECT * FROM table WHERE (SELECT datediff(now(),your-date-in-unixtime) > 30) 
+0

आपको उन फ़ील्ड पर फ़ंक्शंस का उपयोग करने से बचना चाहिए जिन्हें आप फ़िल्टर करने का प्रयास कर रहे हैं क्योंकि यह इंडेक्स को अनुपयोगी बनाता है। – nnichols

1

आप अपने MySQL क्वेरी में ADDDATE() समारोह का उपयोग कर सकते।

> SELECT ADDDATE( '28-03-2012', INTERVAL 1 MONTH) 
28-04-2012 

यह here के बारे में अधिक।

आप अपने expire_date स्तंभ पर एक सूचकांक है, तो यह काफी तेजी से किया जा सकता है अगर आप एक WHERE बयान की तरह साथ प्रविष्टियों के लिए क्वेरी:

WHERE expire_date = ADDDATE(CURDATE(), INTERVAL 1 MONTH) 

(अधिक CURDATE() के बारे में सही here)

हैं आप हर दिन ठीक उसी बार करते हैं, यह केवल अधिकतम लोगों को एक बार अधिकतम चुनता है और उन्हें दो बार ईमेल नहीं भेजता क्योंकि यह केवल उन लोगों का चयन करता है जो उनकी समाप्ति तिथि से बिल्कुल 1 महीने दूर हैं।

बेशक यह आपकी MySQL तालिका में दिनांक फ़ील्ड टाइप का उपयोग करते समय तारीखों के विशिष्ट प्रतिनिधित्व के बारे में कोई अतिरिक्त देखभाल के बिना काम करता है।

3

शायद आपको PHP संख्या के बजाय SQL में ऐसा करना चाहिए?

आप PHP में में क्या करना चाहते हैं, तो यहाँ @Expert की तुलना में एक क्लीनर तरीका

$date = new DateTime();//now 
$interval = new DateInterval('P1M');// P[eriod] 1 M[onth] 
$date->sub($interval); 
echo $date->format('Y-m-d');  
-1

एसक्यूएल आप निम्न क्वेरी

SELECT * 
FROM tablename 
WHERE DATE_FORMAT(created_at, '%Y/%m/%d') = (CURDATE() + INTERVAL 1 MONTH) 
+0

आपको हमेशा ऐसा करने से बचना चाहिए। DATE/DATETIME फ़ील्ड पर 'DATE_FORMAT() 'का उपयोग करके आप फ़िल्टर करना चाहते हैं, किसी भी इंडेक्स को बेकार प्रदान करेगा। – nnichols

2

रूप @Mikhail से कहा आप = का उपयोग करना चाहिए जिससे कि आप केवल एक बार रिकॉर्ड को पुनः प्राप्त: कि वास्तव में आप जो कि 1 महीने में समाप्त हो सकते हैं।

-

SELECT * 
FROM tbl 
WHERE expire_date = CURRENT_DATE + INTERVAL 1 MONTH 

अपने EXPIRE_DATE एक DATETIME के ​​रूप में दिनांक मान आप की तरह कुछ का उपयोग करना चाहिए करने के लिए विरोध मौजूद होता है तो - आप EXPIRE_DATE से ऊपर चल रहा है महीने के पूरे के लिए हर रोज अपने उपयोगकर्ताओं को स्पैम होने के लिए नहीं करना चाहते हैं

SELECT * 
FROM tbl 
WHERE expire_date BETWEEN (CURRENT_DATE + INTERVAL 1 MONTH) AND (CURRENT_DATE + INTERVAL 1 MONTH + INTERVAL 1 DAY - INTERVAL 1 SECOND) 
5

बस;

$WeekAgo = strtotime("-1 week"); //A week before today 
    $MonthAgo = strtotime("-1 month"); //A month before today 
संबंधित मुद्दे