2011-12-28 12 views
1

MySQLデータベースに対してクエリを実行して、総訪問数を週ごとにグループ化します。 テーブルの構造は次のとおりです。php - SQLのweek of year()から文字列/日付へ

|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クエリは正しい方法ですか?私が達成しようとしているものに対してdbを正しく照会していると仮定すると、週番号を日/日付スパンに変換する方法はありますか?

また、週が2か月か2年かにわたる場合、どうなるかと思います。

+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 

はまたからの日付の間の整合性を確保するために、この最後の更新がmakedateコマンド内の他のCASEが含まれていることに気づきます現在および過去の値。

+0

チャームのように働いた! Yeap、それから、私は必要なものを手に入れて表示する方法を知っています。ありがとう、多くの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)。あなたがそれらを接続する場合、訪問は実際には2週間遅れるのではないかと思われます!週の最初の曜日の代わりに、私は前の7日間の訪問を要約し、それらを週の最後の曜日に関連付ける必要があります! – Ion

関連する問題