3

今日次の金曜日DATE間にあるテーブルのすべてのデータを表示する必要があります。

このために、クエリを実行しました:

Select * 
FROM table 
WHERE

  date_row BETWEEN now()+1 
  and DATE_ADD(now(), INTERVAL 
    (9 - IF(DAYOFWEEK(CURDATE())=5, 8, DAYOFWEEK(now()))) DAY)

Next Fridayのデータを返さない Result セット。

4

1 に答える 1

1

MySQLは1日(日曜日)から始まります。CURDATE()代わりにを使用NOW()して時間部分を切り捨てて、日付のみを操作し、呼び出しDATE(date_row)てそこでも切り捨てるようにします。

今日が金曜日の場合は、7日を追加します。今日が金曜日ではなく金曜日より前の場合は、(6-今日の平日)を追加します。今日が土曜日の場合は、6日追加します。

WHERE
  DATE(date_row) BETWEEN CURDATE() AND
    DATE_ADD(CURDATE(), INTERVAL (
      /* It's Friday, add 7 */
      IF(DAYOFWEEK(CURDATE())=6, 7, 
      /* It's Saturday, add 6 */
      IF(DAYOFWEEK(CURDATE())=7, 6,
      /* All other days, add 6 - weekday */
      (6 -DAYOFWEEK(CURDATE())))))
   DAY )

次の金曜日ではなく、次の週の金曜日が必要だと言う場合、金曜日と土曜日は同じですが、他の日は(7 +(6-今日の平日))です。

WHERE
  DATE(date_row) BETWEEN CURDATE() AND
    DATE_ADD(CURDATE(), INTERVAL (
      /* It's Friday, add 7 */
      IF(DAYOFWEEK(CURDATE())=6, 7, 
      /* It's Saturday, add 6 */
      IF(DAYOFWEEK(CURDATE())=7, 6,
      /* All other days, add 6 - weekday + 7*/
      (7 + (6 -DAYOFWEEK(CURDATE()))))))
   DAY )

そして、IF()金曜日は6 + 7 +(6-6)= 7であり、土曜日は7 + 7 + 6-7 = 6であるため、ロジックなしで単純化することができます。

WHERE 
  DATE(date_row) BETWEEN CURDATE() AND
    DATE_ADD(CURDATE(), INTERVAL (7 + (6 - DAYOFWEEK(CURDATE()))) DAY)

最終更新:

今日が金曜日の場合、今日戻りたくない場合は、で使用することはできませCURDATE()BETWEENOR金曜日の場合に実行する条件を追加します。

WHERE
  /* If today is Friday, exclude today, and start counting tomorrow */
  (DAYOFWEEK(CURDATE()) = 6 
     AND DATE(date_row) BETWEEN DATE_ADD(CURDATE(), INTERVAL 1 DAY) AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
  )  
  OR ( 
    DATE(date_row) BETWEEN CURDATE() AND
    DATE_ADD(CURDATE(), INTERVAL ( 
      /* It's Saturday, add 6 */
      IF(DAYOFWEEK(CURDATE())=7, 6,
      /* All other days, add 6 - weekday + 7*/
      (7 + (6 -DAYOFWEEK(CURDATE())))))
    DAY )
  )
于 2012-06-09T13:04:59.093 に答える