1

タスクごとに今週の総労働時間を計算するクエリがあります。

SELECT name AS 'Task Name'
       , sum(hours) AS `Total Hours`
        FROM time_records
        WHERE yearweek(record_date, 3) = yearweek(now(), 3)
        GROUP BY
        weekday(record_date), name

WHERE句は、現在の週を指定します。

WHERE yearweek(record_date, 3) = yearweek(now(), 3)

このデータは、MySQLクエリとPDOステートメントを使用してテーブルとして表示されます。

次に、テーブルの下のリンクをクリックして、視聴者が前の週のデータを表示するためのオプションを追加します(例:「前の週」)。そのデータを表示するには、WHERE句を更新して、前の週を照会する必要があります。

   WHERE yearweek(record_date, 3) = yearweek(now(), 3) - 1

これを行うための最良の方法は何ですか?クエリ全体のバージョンを1つだけ保持したいと思います。1つの考えは、PHPを使用して、次のようにクエリに「-1」を追加することです。

WHERE yearweek(record_date, 3) = yearweek(now(), 3) <?php if (prev) {echo "- 1" ;} ?>

これはうまくいくはずですが、どうすれば前の状態を判断できますか?クエリ全体を関数内に配置して、デフォルトでは「Time_hours(0)」、以前の場合は「Time_hours(1)」にする必要がありますか?それとももっと良い方法がありますか?

コードを管理しやすくし、ベストプラクティスに従うことを懸念しています。ヒントをいただければ幸いです。ありがとう!

4

1 に答える 1

3

処理する数週間前のパラメーターを持つクエリを試すことをお勧めします。YEARWEEKは、年末のロールオーバーの処理が不十分であるため、毎週の処理には適していません。

週が日曜日に始まる場合は、これを試してください。これにより、今週が表示されます。

select r.record_id, r.record_date, w.week weekstart
from record r
join (
    select 
      (FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -1, 7)) 
           - interval 0 week) week
 )w
where record_date >= w.week
  and record_date < w.week + interval 1 week

フィドル:http ://sqlfiddle.com/#!2 / 4c487 / 1/0

必要に応じて、たとえば1週間前に、クエリでに変更- interval 0 week- interval 1 weekます。このフィドルを参照してください。http://sqlfiddle.com/#!2/4c487/2/0

年末にまたがる週でも、任意の数週間前に置くことができます。interval -42 weekたとえば、 ここを参照してください。http://sqlfiddle.com/#!2/4c487/3/0

FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -1, 7))は、現在の日付を前の日曜日に切り捨てます。前の月曜日に丸める場合は、を使用しますFROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -2, 7))。例:http ://sqlfiddle.com/#!2 / 4c487 / 8/0

于 2012-10-15T19:56:16.003 に答える