2011-11-26 10 views
9

आप समय के साथ और PHP/MySQL में मध्यरात्रि के बाद कैसे निपटेंगे?समय के साथ और मध्यरात्रि के बाद

INT स्टोर मिनट का उपयोग करें या TIME टाइप फ़ील्ड का उपयोग करें?

SQL क्वेरी नीचे पर विचार करें:

SELECT * FROM opening_hours 
     WHERE week_day = WEEKDAY(NOW()) + 1 
       AND open_hour =< date_format(now(),'%H:%i') 
       AND close_hour >= date_format(now(),'%H:%i') 

open_hour/close_hour क्षेत्रों TIME प्रकार क्षेत्र हैं।

मान लीजिए कि open_time "18:00" है, क्लोज_टाइम "02:00" है, वर्तमान समय "22:41" है। हमारे पास क्लोज_टाइम के लिए एक अलग डीबी रिकॉर्ड है (क्योंकि यह मध्यरात्रि के बाद है), लेकिन हम इसे परिणाम में कभी नहीं प्राप्त करेंगे, क्योंकि क्लोज_टाइम "02:00" वर्तमान समय से अधिक नहीं है, "22:41"।

यदि वर्तमान समय "01:00" है, तो हमें अगले दिन मूल्य मिलेंगे, क्योंकि सप्ताहांत मेल नहीं खाता है।

तो समाधान क्या है?

क्या आप इन मानों को INT (मिनट) में स्टोर करेंगे, तो PHP किसी भी रूपांतरण के बिना इन मानों को सीधे संसाधित करने में सक्षम है?

उदाहरण के लिए

...

वर्तमान समय:

// w = Day of the week, H = 24-hour format, i = Minutes 
$timearr = explode(':',date("w:H:i")); 
$currenttime = ($timearr[0]) * 1440 + $timearr[1] * 60 + $timearr[2] 

डेटाबेस में संग्रहीत खोलने/बंद समय मिनट में मान।

अब मान लीजिए कि वर्तमान समय "सूर्य, 01:00" (सप्ताह का पहला दिन) है, उपरोक्त कवरन निष्पादित करने के लिए यह मान 60 है; और सप्ताह के आखिरी दिन (शनिवार) के लिए खुले/बंद समय "17:00" और "02:00" (जो वास्तव में रविवार है) पर सेट होते हैं, डीबी में 9660 और 10200 (शनिवार, 26:00) के रूप में संग्रहीत होते हैं। । इस मामले में, उपरोक्त क्वेरी को हमें आवश्यक रिकॉर्ड (शनि, 17:00, 02:00) नहीं मिलेगा, क्योंकि हमारे पास शायद "02:00" (120) से कम कोई open_time नहीं है। इसे हल करने के लिए, हम "सन, 01:00" से "शनि, 25:00" को $ 7 * 1440 (पूरे सप्ताह) को $ currenttime में जोड़कर परिवर्तित करते हैं, जिसके परिणामस्वरूप 10140 होगा। फिर डीबी क्वेरी इस तरह:

SELECT open_time,clos_time FROM open_hours 
    WHERE (open_time <= $currenttime 
     AND close_time >= $currenttime) 
     OR (open_time <= $currenttime +10080 
     AND close_time >= $currenttime + 10080); 

या वैकल्पिक और neater समाधान क्या है?

+0

शायद उस समय के साथ एक तिथि स्टोर करना चाहिए? मध्यरात्रि के समय के बाद टॉमोरो का समय बन जाता है। एक DATETIME प्रारूप का भी उपयोग करें, न कि INT या अन्य –

+0

नहीं, मैं DATETIME का उपयोग नहीं कर सकता क्योंकि मैं दिनांक का उपयोग नहीं कर रहा हूं। रोज़ाना खुलें, मैं पूरे साल की तारीख नहीं जोड़ना चाहता! –

+0

http://stackoverflow.com/questions/8225684/how-to-find-out-if-store-open-or-close-dealing-with-hours –

उत्तर

1

भंडारण मिनट (int (4) हस्ताक्षरित) जाने का तरीका है।
हालांकि, बजाय काम करने के दिन + opening_hour भंडारण, बंद होने का समय (ऑफसेट के साथ),
आप सोमवार 12:00 के बाद से मिनट संग्रहीत करना चाहिए: -

Monday 18:00 = (1 - 1)*60 * 18 = 1080 
Tuesday 02:00 = (2 - 1)*60 * 24 + (2 * 60) = 1560 
... 
// please take note shop could have different operating hour for each day 

तो, वर्तमान समय मंगलवार 1:30 बजे है जो है: -

// mysql expression 
$expr = (weekday(current_timestamp)+1) * 1440 + (hour(current_timestamp)*60) + minute(current_timestamp) 

एसक्यूएल: -

select ... 
from opening_hours 
where 
open_time >= $expr and 
close_time <= $expr; 
+0

मैं इस भाग को नहीं समझता: '(1 - 1)' और '(2 - 1)'? यह क्या है? –

+0

1 = सप्ताहांत से सोमवार, सोमवार = 0, मंगलवार = 1 .. रविवार = 7 (इसका मतलब सप्ताह का प्रारंभ सोमवार है) – ajreal

+0

यदि आप मुझसे पूछें तो आवश्यकतानुसार जटिलता की एक अतिरिक्त परत की तरह लगता है। इससे पहले कि मैं ऐसा करूंगा (उदाहरण के लिए 0800, 1200, 2140 इत्यादि) मैं 24 घंटों की घड़ी में स्ट्रिंग के रूप में एक स्टोर के रूप में स्टोर करूंगा। तुलना अभी भी काम करती है और आप आसानी से संख्याओं को देख सकते हैं और समझ सकते हैं कि क्या हो रहा है। – Zoidberg

1
SELECT open_time,close_time FROM open_hours 
    WHERE 
     (open_time <= close_time AND 
     open_time <= $currenttime AND 
     close_time >= $currenttime) 
     OR 
     (open_time >= close_time AND 
     ($currenttime <= close_time OR 
     $currenttime >= open_time)) 

तो क्या मैं यहाँ कर रहा हूँ है अगर open_time close_time से अधिक है, तो यह, आधी रात अवधि जिस स्थिति में मैं सुनिश्चित करने के लिए वर्तमान टाइमर खुला समय से अधिक, या तो यह करीब समय से भी कम है की जांच करना चाहिए हमारे समय अवधि

ओपन समय ------ आधी रात ----- बंद समय

में गिरावट तो खुलने का समय पास समय की तुलना में कम है सुनिश्चित किया जाता है, तो हम जानते हैं कि मध्य रात्रि में नहीं आता है के बीच में। नतीजतन हम सामान्य के रूप में जांच सकते हैं।

+0

आह, इसलिए आप इन मानों को INT (मिनट) में स्टोर करना पसंद करते हैं। इस दशा में? –

+0

यह वही है जो आप चाहते हैं। मुझे पता है कि इस स्थिति में तारीख अप्रासंगिक है, इसलिए मुझे लगता है कि डेटाटाइम जाने का रास्ता नहीं होगा। मुझे लगता है कि MySQL http://dev.mysql.com/doc/refman/5.0/en/time.html में एक समय प्रकार है जो आदर्श होगा। – Zoidberg

0

मुझे पता है कि आपके क्या करने की कोशिश कर रहा है, हमें लेकिन न यूनिक्स टाइमस्टैम्प में हमेशा मेरे विकल्प में सही जवाब रहा है। गणना करने में आसान है, और समय क्षेत्र के बावजूद यह हमेशा सही है।

शायद आपको उस

+0

टाइमस्टैम्प अभी भी तारीख की जानकारी संग्रहीत करता है, जो इस मामले में आवश्यक नहीं है क्योंकि निकट और खुले समय प्रतिदिन फिर से होते हैं। – Zoidberg

+0

हाँ लेकिन आप उचित समय निकाल सकते हैं: गूंज दिनांक ("जी: मैं एक", $ टाइमस्टैम्प); –

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