2015-03-04 5 views
5

मैं सप्ताह के वर्तमान दिन के आधार पर MySQL में एक दृश्य बनाने की कोशिश कर रहा हूं। मैं सप्ताह के दिन के आधार पर कार्यों का ट्रैक रखने के लिए एक टेबल बना रहा हूं। उदाहरण के लिए, प्रत्येक मंगलवार को कुछ कार्य होंगे, कुछ बुधवार और शुक्रवार को होंगे।क्या MySQL में क्लॉज में वर्तमान दिन का नाम उपयोग करना संभव है?

मैंने सप्ताह के प्रत्येक दिन के लिए तालिका को एक कॉलम के साथ सेट करने का निर्णय लिया। कार्य उस दिन निष्पादित करने की आवश्यकता अगर मैं कॉलम में एक 1 स्टोर करेगा, अन्यथा यह एक 0. तालिका इस तरह दिखता हो जाएगा:

| ID | Monday | Tuesday | Wednesday | Thursday | Friday | Task  | 
----------------------------------- 
| 1 | 0 | 1 |  0  |  0 | 0 | "SomeTask" | 
| 2 | 0 | 0 |  1  |  0 | 1 | "SomeTask" | 
| 3 | 0 | 1 |  0  |  0 | 0 | "SomeTask" | 

मैं एक SELECT कथन है कि हो जाएगा बनाना चाहेंगे उन कार्यों को दिखाने के लिए उपयोग किया जाता है जिन्हें वर्तमान दिन निष्पादित करने की आवश्यकता है। दूसरे शब्दों में, आज मंगलवार है इसलिए मैं एक प्रश्न पूछना चाहता हूं जो दिखाने के लिए 1 और 3 की आईडी के साथ पंक्तियां प्राप्त करेगी।

मैंने कोशिश की निम्नलिखित है, लेकिन यह काम नहीं किया:

SELECT * FROM MyTasks WHERE DAYNAME(curdate()) = 1 

वहाँ तालिका स्वरूपित करने के लिए एक बेहतर तरीका है? WHERE खंड में DAYNAME का उपयोग करने के लिए वैसे भी है? कोई सुझाव?

+0

आप, आपकी क्वेरी का निर्माण –

उत्तर

5

आप इस तरह case उपयोग कर सकते हैं:

SELECT * FROM `MyTasks` WHERE (CASE DAYNAME(NOW()) 
      WHEN 'Monday' THEN `Monday`=1 
      WHEN 'Tuesday' THEN `Tuesday`=1 
      WHEN 'Wednesday' THEN `Wednesday`=1 
      WHEN 'Thursday' THEN `Thursday`=1 
      WHEN 'Friday' THEN `Friday`=1 
      END) 

अलावा कि मैं तुम्हें इस पूरा करने की किसी भी तरह से नहीं दिख रहा है, के रूप में स्तंभ नाम स्थिर हैं और गतिशील रूप से निर्मित नहीं किया जा सकता अन्य कार्यों आदि के आधार पर

+0

यह काम किया! धन्यवाद! – smiler07

+0

ओएमजी ... यह कमाल है !! मेरे पास एक ही स्थिति थी लेकिन इसे समझ नहीं सका। मुझे समझ में नहीं आता है कि हम क्यों नहीं कह सकते हैं "जहां दिन का नाम (अब) = 1" वह क्यों है? और यह डायनामिक रूप से उस कॉलम नाम को सेट करने का एकमात्र तरीका है जिसे हम तिथि के आधार पर चाहते हैं? मैं भविष्य के संदर्भ के लिए सभी तरीकों को जानना चाहता हूं - धन्यवाद :) – carinlynchin

0

बेहतर होगा कि Day नाम के एक स्तंभ है कि सप्ताह के प्रत्येक दिन की एक enum होगा इस तरह, 7 कॉलम आपके पास करने के बजाय, परिभाषित करने के लिए:

`Day ENUM(1, 2, 3, 4, 5, 6, 7)` 

फिर आप बस में बदल सकते हैं पर्याप्त मूल्य (1 से 7 तक जैसे) में वर्तमान दिन और अपने SQL क्वेरी में इसका इस्तेमाल करते हैं, इस का उपयोग कर PHP की तरह:

$sql = 'select * from table where Day = ' . date('N'); 

date('N') सप्ताह की वर्तमान दिन के आधार पर 7 1 से मान प्रदान करेगा ।

नोट: यह मशीन चलने वाली मशीन के सर्वर समय का उपयोग करेगा।

CREATE TABLE IF NOT EXISTS `enumtest` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `Day` enum('1','2','3','4','5','6','7') NOT NULL, 
    `Task` varchar(100) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 
+0

तो नीचे मेरा उत्तर देखने के लिए 'case' का उपयोग करना चाहिए, ऐसा लगता है कि enum केवल आपको एक मूल्य देता है। मैंने कॉलम किया ताकि मेरे पास एक ही कार्य के लिए कई दिन हो सकें। क्या यह enum के साथ संभव है? – smiler07

+0

मैंने अभी अपनी पोस्ट संपादित की है और आपको तालिका के लिए एक उदाहरण प्रदान किया है। – alfallouji

+0

मुझे लगता है कि यह एक अच्छा विचार है !! मैं इसे एक दृश्य में रखना चाहता था, लेकिन मुझे लगता है कि यह वर्तमान दिन को PHP के साथ प्राप्त करने के लिए काम करेगा और तदनुसार SQL क्वेरी बनायेगा। एकमात्र चीज जो अलग है वह यह है कि कार्य से डेटाबेस में डुप्लिकेट डेटा होगा। क्या आप कार्य के लिए एक नई पंक्ति बनाने का सुझाव देंगे भले ही यह सप्ताह के हर दिन होता है? – smiler07

0

DAYNAME रिटर्न आप एक सप्ताह में एक दिन का नाम है, तो आपकी क्वेरी होना चाहिए::

SELECT * FROM MyTasks WHERE DAYNAME(NOW()) = 'Saturday'; 

मैं तुम्हें DAYOFWEEK समारोह की जरूरत है पाने के लिए लगता है

यहाँ तालिका का एक उदाहरण है सप्ताह के दिन सूचकांक।

+0

प्रारंभिक पोस्ट में सूचीबद्ध तालिका के आधार पर, और दिन को बुधवार (सप्ताह के आज का दिन) बदलना, यह उन परिणामों को वापस नहीं लौटाता है जिन्हें मैं ढूंढ रहा हूं। अगर वे अलग-अलग होते हैं तो दिन या तो कोई पंक्ति नहीं होने पर यह सभी पंक्तियों को वापस कर देगा। – smiler07

0

जो आप ढूंढ रहे हैं उसे पाने के लिए WEEKDAY() फ़ंक्शन का उपयोग करें।

SELECT * FROM MyTasks WHERE WEEKDAY(curdate()) = 1 
+0

यह मुझे वह परिणाम नहीं देता है जिसे मैं ढूंढ रहा हूं। सप्ताहांत समारोह दिन के संख्यात्मक मूल्य देता है। मेरे कॉलम नाम के रूप में लेबल हैं। मुझे लगता है कि यह या तो 0 पंक्तियों या पूर्ण तालिका को वापस करेगा यदि यह मंगलवार (दिन 1) है या नहीं। – smiler07

0

आप अपने मॉडल को इसके रूप में रख सकते हैं और दो समाधानों में से एक का उपयोग कर सकते हैं: कॉलम मान (हैकी) के साथ अपनी भाषा पर कॉलम नाम को अलग करें या आप इसके लिए संग्रहीत प्रक्रिया का उपयोग कर सकते हैं।

लेकिन आप आरडीबीएमएस सामान्य तरीके से दो तालिकाओं और संयुक्त एक के साथ भी ऐसा कर सकते हैं।आपके स्कीमा में आपके पास सप्ताहांत, एक कार्य और सप्ताहांत_टास्क तालिका होगी।

तालिका कार्य में केवल सरोगेट सीरियल आईडी के साथ ही कार्य से संबंधित डेटा होगा। तालिका सप्ताहांत केवल सप्ताह के दिन से संबंधित डेटा, कुछ भी नहीं, केवल इसके नाम के रूप में जानकारी और शायद एक कार्यदिवस विशेषता।

और संयुक्त कार्य में केवल पीके और सप्ताहांत पीके शामिल होगा। यह एक साधारण एन: एम संबंध है और रिकॉर्ड केवल नियुक्तियों के लिए मौजूद होगा।

यह मॉडल शायद सामान्य डोमेन समस्या से संबंधित बहुत सारी चीज़ें खो रहा है और यह सीखने का अभ्यास प्रतीत होता है, इसलिए, यदि यह सीखने के बारे में है, तो आपको एन: एम समाधान के साथ जाना चाहिए।

वास्तविक समस्या शायद कार्य और सप्ताहांत_टास्क दोनों के लिए (वैध समय, प्रारंभ और अंत) की आवश्यकता होगी, क्योंकि सप्ताहांत शायद एक विशिष्ट दिन साथी प्राप्त करेगा, वास्तविक दुनिया आवृत्तियों से निपटने के लिए एक और जटिल समाधान के रूप में । यह छोटी चीजें नहीं है और हो सकता है कि गोफ ने पहले से ही आपके लिए दृढ़ता मॉडल और डोमेन मॉडल दोनों के रूप में मैप किया हो।

1

आप DAYNAME का उपयोग करने का दिन नाम प्राप्त कर सकते हैं (curdate()) समारोह इस लौटा रहा है गुरुवार (आज 2015-03-05 है) लेकिन,

अपनी मेज संरचना के अनुसार उपयोग करने के लिए निम्न में से 1 MyTasks कहां (

मामला DAYNAME (curdate())

के सवालों

01 चुनें *

02 का चयन MyTasks से * कहां (

मामला काम करने के दिन (curdate())

 WHEN 0 THEN `Monday`=1 
     WHEN 1 THEN `Tuesday`=1 
     WHEN 2 THEN `Wednesday`=1 
     WHEN 3 THEN `Thursday`=1 
     WHEN 4 THEN `Friday`=1 
     END) 
संबंधित मुद्दे