2011-12-28 49 views
1

我對MySQL數據庫運行一個查詢以獲得按周分組的訪問總數。 表的結構是:php - 一年中SQL的一週()到字符串/日期

|ID (int) | SESSION (char) | TIMESTAMP (datetime) |

我的查詢看起來是這樣的: 'SELECT COUNT(session), WEEKOFYEAR(timestamp) FROM stats GROUP BY WEEKOFYEAR(timestamp) ORDER BY timestamp ASC';

所以我得到一週的數字陣列,例如40,41,45等,這樣的觀點計數一起。

如何將其轉換爲可讀的日期(使用PHP)?說「第40周:2000次訪問」是不實際的。

我正在尋找StartDate-EndDate/Month/Year的形式,例如。第5-11/12/2011周,訪問:XXXX。

以前可能使用過的任何功能?我已經嘗試過但沒有運氣。

我的SQL查詢是否是正確的方法?假設我正在爲我正在嘗試完成的事情正確查詢數據庫,有沒有辦法將星期數轉換爲日期/日期範圍?

我也想知道如果一個星期在兩個月甚至兩年之間會發生什麼事情。

+0

-1,我不認爲這是有道理的。據我所知,爲了在mysql中返回dayofweek,數據源也需要是一個日期。所以,你錯過了大量的關鍵信息。你應該再次修改你的問題。 – ajreal

+0

@ajreal現在好點了嗎?我不知道還有什麼要包括的。我認爲它應該有點普遍。也許我不是在想它是對的? – Ion

+0

是的,如果沒有這些信息(模式)幾乎不可能理解你的問題。好的,回到你的問題,因爲你的源是時間戳(這意味着你可以返回任何格式)**但是**你正在使用** GROUP BY **。 (聚合函數)。我認爲是不可能的......或者你可以添加更多的輸入例子和你想要的輸出。 – ajreal

回答

2

假設:

  • 要顯示的日期是該週週一週日期
  • 你的主要輸出是Week <week number>-<monday date of week>, Visits: <count>.
  • 你知道足夠的PHP能夠拉列Phrase

以下SQL命令應該爲您顯示每年,每週的一週以及所需短語的會話數:

SELECT COUNT(session) AS VisitCount 
    , WEEKOFYEAR(timestamp) AS WeekOfYear_Value 
    , MAKEDATE(
     CASE 
      WHEN WEEKOFYEAR(timestamp) = 52 
       THEN YEAR(timestamp)-1 
      ELSE YEAR(timestamp) 
     END, (WEEKOFYEAR(timestamp) * 7)-4) AS DateOfWeek_Value 
    , CONCAT('Week ', WEEKOFYEAR(timestamp) 
     , '-', MAKEDATE(
      CASE 
       WHEN WEEKOFYEAR(timestamp) = 52 
        THEN YEAR(timestamp)-1 
       ELSE YEAR(timestamp) 
      END, (WEEKOFYEAR(timestamp) * 7)-4) -- Monday 
     , ', Visits: ' , COUNT(session), '.') AS Phrase 
FROM stats 
GROUP BY WEEKOFYEAR(timestamp) 
ORDER BY timestamp ASC 

試試看你現有的數據。

[編輯:額外更改代碼]

爲了讓您的星期天輸出:

SELECT COUNT(session) AS VisitCount 
    , WEEKOFYEAR(timestamp) AS WeekOfYear_Value 
    , CONCAT('Week ', WEEKOFYEAR(timestamp) 
     , '-', MAKEDATE(
      CASE 
       WHEN WEEKOFYEAR(timestamp) = 52 
        THEN YEAR(timestamp)-1 
       ELSE YEAR(timestamp) 
      END, 
      CASE 
       WHEN WEEKOFYEAR(timestamp) = 52 
        THEN (WEEKOFYEAR(timestamp) * 7)+3 
       ELSE (WEEKOFYEAR(timestamp) * 7)+2 
      END 
      ) 
    , ', Visits: ' , COUNT(session), '.') AS Phrase 
FROM stats 
GROUP BY WEEKOFYEAR(timestamp) 
ORDER BY timestamp ASC 

還要注意的是這最後的更新還包括另一CASEmakedate命令,以確保從日期之間的一致性當前和去年的價值。

+0

工作就像一個魅力!從那時起,我知道如何獲得和展示我需要的東西。非常感謝Nonym。 – Ion

+1

太棒了!只需注意; 'case'聲明是這樣的,如果一年中的第52周,我們確保'makedate'命令使用前一年而不是當前年份來避免一週的'2011-01-01'指向2011年12月26日。此外,我用'-4'指向星期一,認爲這可能是宣佈星期的方式。 – Nonym

+0

而不是每個星期的第一天,我怎麼能得到最後一個?因爲我在連續的XY圖上(X是日期 - 星期一,Y是訪問)可視化數據,圖表似乎有點偏離。例如,對於以下值:第1-7周 - > 1000周,第7-14周 - > 1500周,第14-21周 - > 500周,創建以下點a(1,1000),b(1,1500) ,c(1,500)。如果你連接他們,看起來好像訪問實際上是在第二週而不是起來!因此,而不是一週的第一天,我需要總結前7天的訪問並將它們與本週的最後一天聯繫起來! – Ion

相關問題