Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

काम के घंटों को स्टोर करने और इसे कुशलता से क्वेरी करने का सबसे अच्छा तरीका

सामान्य संचालन घंटों को संग्रहीत करने के लिए, आपको कई रिकॉर्डों को संग्रहीत करने की आवश्यकता होगी जिनमें शामिल हैं:

  • दुकान - पूर्णांक
  • दिन का सप्ताह - पूर्णांक (0-6)
  • खुला समय - समय
  • निकट समय - समय

मैं उदाहरण के लिए मानता हूं कि प्रत्येक दुकान ने राष्ट्रीय छुट्टियों के दौरान घंटे कम कर दिए हैं, या संयंत्र बंद हो गए हैं, इसलिए आपको कुछ ओवरराइड रिकॉर्ड भी स्टोर करने होंगे:

  • दुकान - पूर्णांक
  • प्रारंभ दिनांक - दिनांक को ओवरराइड करें
  • ओवरराइडEndDate - DATE
  • दिन का सप्ताह - पूर्णांक (0-6)
  • AltOpenTime - TIME
  • AltCloseTime - TIME
  • बंद - पूर्णांक (0, 1)

खुली दुकानों को ढूंढना मामूली है, लेकिन आपको यह भी जांचना होगा कि ओवरराइड घंटे हैं या नहीं:

SELECT Shop
FROM OverrideHours
WHERE OverrideStartDate <= NOW()
AND OverrideEndDate >= NOW()
AND DayOfWeek = WEEKDAY(NOW())

यदि कोई रिकॉर्ड लौटाया जाता है, तो उन दुकानों के पास वैकल्पिक घंटे होते हैं या बंद हो जाते हैं।

कुछ अच्छे SQL-fu हो सकते हैं जो आप यहाँ कर सकते हैं, लेकिन यह आपको मूल बातें देता है।

संपादित करें

मैंने इसका परीक्षण नहीं किया है, लेकिन यह आपको करीब ले जाना चाहिए:

SELECT Normal.Shop
FROM Normal
LEFT JOIN Override
ON Normal.Shop = Override.Shop
AND Normal.DayOfWeek = Override.DayOfWeek
AND NOW() BETWEEN Override.OverrideStartDate AND Override.OverrideEndDate
WHERE Normal.DayOfWeek = WEEKDAY(NOW())
AND ((Override.Shop IS NULL AND TIME(NOW()) BETWEEN Normal.OpenTime AND Normal.CloseTime)
 OR  (Override.Shop IS NOT NULL AND Override.Closed <> 1 AND TIME(NOW()) BETWEEN Override.AltOpenTime AND Override.AltCloseTime))

संपादित करें

दक्षता के लिए, यह इस अर्थ में कुशल है कि आपको केवल MySQL को एक कॉल करना है जो कि नेटवर्क पर होने पर अक्सर एक बाधा है। आपको परीक्षण करना होगा और देखना होगा कि यह आपके विनिर्देशों के अनुरूप है या नहीं। यदि नहीं, तो आपको कुछ सूचकांकों के साथ खेलना पड़ सकता है।

संपादित करें

परिक्षण। पूर्ण परीक्षण नहीं, लेकिन कुछ।

mysql> select * from Normal;
+------+-----------+----------+-----------+
| Shop | DayOfWeek | OpenTime | CloseTime |
+------+-----------+----------+-----------+
|    1 |         1 | 09:00:00 | 17:00:00  | 
|    1 |         5 | 09:00:00 | 16:00:00  | 
|    2 |         1 | 09:00:00 | 17:00:00  | 
|    2 |         5 | 09:00:00 | 17:00:00  | 
+------+-----------+----------+-----------+
4 rows in set (0.01 sec)

mysql> select * from Override;
+------+-------------------+-----------------+-----------+-------------+--------------+--------+
| Shop | OverrideStartDate | OverrideEndDate | DayOfWeek | AltOpenTime | AltCloseTime | Closed |
+------+-------------------+-----------------+-----------+-------------+--------------+--------+
|    2 | 2010-12-01        | 2010-12-31      |         1 | 09:00:00    | 18:00:00     |      0 | 
|    2 | 2010-12-01        | 2010-12-31      |         5 | 09:00:00    | 18:00:00     |      0 | 
|    1 | 2010-12-01        | 2010-12-31      |         1 | 09:00:00    | 17:00:00     |      1 | 
+------+-------------------+-----------------+-----------+-------------+--------------+--------+
3 rows in set (0.00 sec)

mysql> SET @whenever = TIMESTAMP('2010-11-23 16:05');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT WEEKDAY(@whenever);
+--------------------+
| WEEKDAY(@whenever) |
+--------------------+
|                  1 | 
+--------------------+
1 row in set (0.00 sec)

mysql> SELECT Normal.Shop FROM Normal LEFT JOIN Override ON Normal.Shop = Override.Shop AND Normal.DayOfWeek = Override.DayOfWeek AND @whenever BETWEEN Override.OverrideStartDate AND Override.OverrideEndDate WHERE Normal.DayOfWeek = WEEKDAY(@whenever) AND ((Override.Shop IS NULL AND TIME(@whenever) BETWEEN Normal.OpenTime AND Normal.CloseTime)  OR  (Override.Shop IS NOT NULL AND Override.Closed <> 1 AND TIME(@whenever) BETWEEN Override.AltOpenTime AND Override.AltCloseTime));
+------+
| Shop |
+------+
|    1 | 
|    2 | 
+------+
2 rows in set (0.00 sec)

mysql> SET @whenever = TIMESTAMP('2010-11-23 17:05');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT Normal.Shop FROM Normal LEFT JOIN Override ON Normal.Shop = Override.Shop AND Normal.DayOfWeek = Override.DayOfWeek AND @whenever BETWEEN Override.OverrideStartDate AND Override.OverrideEndDate WHERE Normal.DayOfWeek = WEEKDAY(@whenever) AND ((Override.Shop IS NULL AND TIME(@whenever) BETWEEN Normal.OpenTime AND Normal.CloseTime)  OR  (Override.Shop IS NOT NULL AND Override.Closed <> 1 AND TIME(@whenever) BETWEEN Override.AltOpenTime AND Override.AltCloseTime));
Empty set (0.01 sec)

mysql> SET @whenever = TIMESTAMP('2010-12-25 16:05');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT Normal.Shop FROM Normal LEFT JOIN Override ON Normal.Shop = Override.Shop AND Normal.DayOfWeek = Override.DayOfWeek AND @whenever BETWEEN Override.OverrideStartDate AND Override.OverrideEndDate WHERE Normal.DayOfWeek = WEEKDAY(@whenever) AND ((Override.Shop IS NULL AND TIME(@whenever) BETWEEN Normal.OpenTime AND Normal.CloseTime)  OR  (Override.Shop IS NOT NULL AND Override.Closed <> 1 AND TIME(@whenever) BETWEEN Override.AltOpenTime AND Override.AltCloseTime));
+------+
| Shop |
+------+
|    2 | 
+------+
1 row in set (0.00 sec)

mysql> SET @whenever = TIMESTAMP('2010-11-23 17:05');
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT WEEKDAY(@whenever);
+--------------------+
| WEEKDAY(@whenever) |
+--------------------+
|                  1 | 
+--------------------+
1 row in set (0.00 sec)

mysql> SELECT Normal.Shop FROM Normal LEFT JOIN Override ON Normal.Shop = Override.Shop AND Normal.DayOfWeek = Override.DayOfWeek AND @whenever BETWEEN Override.OverrideStartDate AND Override.OverrideEndDate WHERE Normal.DayOfWeek = WEEKDAY(@whenever) AND ((Override.Shop IS NULL AND TIME(@whenever) BETWEEN Normal.OpenTime AND Normal.CloseTime)  OR  (Override.Shop IS NOT NULL AND Override.Closed <> 1 AND TIME(@whenever) BETWEEN Override.AltOpenTime AND Override.AltCloseTime));
Empty set (0.00 sec)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सुरक्षा सलाहकार MySQL अलर्ट को कैसे ठीक करें

  2. डेनो और ओक के साथ MySQL का उपयोग कैसे करें

  3. SQL LIKE% अंदर सरणी

  4. प्वाइंट का उपयोग कर मैसकल स्थानिक दूरी - काम नहीं कर रहा

  5. गंभीर त्रुटि:विशेषाधिकार तालिकाओं को खोल और लॉक नहीं कर सकता:तालिका 'mysql.host' मौजूद नहीं है