簡體   English   中英

使MySQL查詢動態化的最佳方法(例如,更新查詢參數以顯示上周)

[英]Best method for making a MySQL query dynamic (e.g., update query parameters to show Previous Week)

我有一個查詢,它按任務計算當前工作周的總工作時數:

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

我想知道最好的方法是什么? 我寧願只保留整個查詢的一個版本。 一種想法是使用PHP在查詢中添加“ - 1”,例如:

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

我認為這應該有效,但我怎樣才能確定現狀? 我應該將整個查詢放在一個函數中,以便默認情況下它可以是“Time_hours(0)”,對於之前的它可以是“Time_hours(1)” - 或者是否有更好的方法?

我擔心保持代碼可管理並遵循最佳實踐。 任何提示將不勝感激。 謝謝!

我建議您嘗試一個查詢,其中包含您要處理的周數之前的參數。 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

如果你想要,比如說,一周前,在你的查詢中改變- 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()) -1, 7))到上一個星期日。 如果要將其舍入到上一個星期一,請使用FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -2, 7)) 例如: http//sqlfiddle.com/#!2/4c487/8/0

暫無
暫無

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

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