4

金曜日の開始日に基づく週次レポートの作成に役立つ次のコードを見つけました。指示には、「.$startWeekDay」を置き換えるように書かれています。'".$startDay."' を '2013-01-30' にすると、エラーが発生します。

また、希望に応じて、週単位ではなく日単位でレポートを受け取ります。

SELECT  SUM(cost) AS total, 
    CONCAT(IF(date - INTERVAL 6 day < '".$startDay."', 
            '".$startDay."', 
            IF(WEEKDAY(date - INTERVAL 6 DAY) = ".$startWeekDay.", 
                date - INTERVAL 6 DAY, 
                date - INTERVAL ((WEEKDAY(date) - ".$startWeekDay.")) DAY)),
        ' - ', date) AS week, 
        IF((WEEKDAY(date) - ".$startWeekDay.") >= 0, 
            TO_DAYS(date) - (WEEKDAY(date) - ".$startWeekDay."), 
            TO_DAYS(date) - (7 - (".$startWeekDay." - WEEKDAY(date))))     AS sortDay 
FROM    daily_expense
WHERE   date BETWEEN '".$startDay."' AND '".$endDay."' 
GROUP BY sortDay;

次のコードは私が使用しているものです

SELECT count(DISTINCT (
UserID)
) AS total, CONCAT(IF(date(LastModified) - INTERVAL 6 day < date(LastModified), 
            date(LastModified), 
            IF(WEEKDAY(date(LastModified) - INTERVAL 6 DAY) = 4, 
                 date(LastModified) - INTERVAL 6 DAY, 
                date(LastModified) - INTERVAL             ((WEEKDAY(date(LastModified)) - 4)) DAY)),
        ' - ',  date(LastModified)) AS week 

FROM  `Purchase` 
WHERE  `OfferingID` =87
AND  `Status` 
IN ( 1, 4 ) 

GROUP BY 週

私が得る出力は

total   week
3   2013-01-30 - 2013-01-30
1   2013-01-31 - 2013-01-31
4

1 に答える 1

1

週をどのように表示したいか正確にはわかりません。上記のSQLは日付範囲を表示しようとしています。これが必要でない場合、クエリは非常に単純で、時間を 2 日ずらして (金曜日は本来の週の星から 2 日離れているため)、week 関数を使用して週番号を取得できます。

クエリは次のようになります。

select count(distinct (UserID)) as total
, year( LastModified + interval 2 day ) as year
, week( LastModified + interval 2 day ) as week_number
FROM  `Purchase` 
WHERE  `OfferingID` =87
AND  `Status` 
IN ( 1, 4 )
group by year, week_number;
于 2013-04-07T02:35:40.813 に答える