簡體   English   中英

在MySql中根據工作日和特定時間選擇記錄

[英]Select records based on week day and specific time in MySql

我需要根據特定條件過濾掉特定事件,例如

  • [x]莫
    • [x] 12:00
    • [] 14:00
  • [x]星期二
    • [] 12:00
    • [x] 15:30
  • [x]星期五
    • [] 10:00
    • [] 11:30
    • [x] 17:15
    • [x] 18:00

它在php中提供以下數組:

array(
   0 => [[12, 00]],
   1 => [[15, 30]],
   4 => [[17, 15], [18, 00]]
)

最終的數組可能會根據需要進行調整,但是現在我想從具有存儲日期時間的starts_at屬性的schedule_event表中進行選擇。

問題是,是否可以選擇特定的事件,例如,星期一將返回從12:00開始的事件(不應該在星期二),星期五將返回17:15和18:00。

到目前為止,我有:

... WEEKDAY(se.startsAt) IN (:weekDays) ...

:weekDays只是給定數組的array_keys 現在,我不知道現在該如何實際包含時間。

您必須創建成對的工作日-小時[-分鍾]條件才能達到預期的結果:

select ...
from ...
where WEEKDAY(se.startsAt)=0 and hour(se.startsAt)=12
   or WEEKDAY(se.startsAt)=1 and hour(se.startsAt)=15 and minute(se.startsAt)=30
   ...

除了使用小時和分鍾功能,您還可以使用單個date_format()調用,但我將留給您。

您不能再使用WEEKDAY IN (list of days)因為僅工作日不足以產生真相。 您需要一個OR列表,每個OR由一個工作日條件和該天的小時條件組成,這是一個列表,最后的這些條件將與在一起。

因此,您將數組組裝到一個SQL查詢中,在該查詢中必須同時構建SQL和值:

array(
    0 => [[12, 00]],
    1 => [[15, 30]],
    4 => [[17, 15], [18, 00]]
)


$sets   = [ ]; // SQL conditions for each day
$values = [ ]; // List of accumulated values to send to execution

foreach ($conditions as $dayNum => $listTimes) {
   $hours = [ ];
   $values[] = (int)$dayNum;

   // Each time is an array of (hour, minute)
   // which comes handy for building the query
   foreach ($listTimes as $pair) {
       $hours[] = '(HOUR(se.startsAt) = ? AND MINUTE(se.startsAt) = ?)';
       $values[] = (int)$pair[0];
       $values[] = (int)$pair[1];
   }
   $sets[] = "(WEEKDAY(se.startsAt)=? AND (" . implode(' OR ', $hours) . "))";
}

$filter = implode(' OR ', $sets);

這將變成類似(省略清楚的參數)

(WEEKDAY=0 AND ((HOUR=12 AND MINUTE=0)))
OR
(WEEKDAY=1 AND ((HOUR=12 AND MINUTE=0) OR (HOUR=14 AND MINUTE=30)))
...

所以:

// PREPARE this
$sql = "SELECT ... WHERE {$assembledConditions}";
// And EXECUTE passing $values.

當然,查詢中的任何其他值都需要事先放在$values中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM