揮発性のメモ2

http://d.hatena.ne.jp/iww/

週ごとの合計を出す

月の第何週ごとの集計を出すときは

SELECT
    TO_CHAR(hdate,'YYYY-MM/w'),
    COUNT(*) as count
FROM
    hoge
GROUP BY
    TO_CHAR(hdate,'YYYY-MM/w')
ORDER BY
    TO_CHAR(hdate,'YYYY-MM/w')


月またぎを無視して、とにかく週ごとの集計を出すときは

SELECT
    TO_CHAR( TRUNC(hdate,'DAY'),'YYYY-MM-DD'),
    COUNT(*) as count
FROM
    hoge
GROUP BY
    TRUNC(hdate,'DAY')
ORDER BY
    TRUNC(hdate,'DAY')

TO_CHAR()

数値型や日付型などを文字列に変換する関数
TO_CHAR(hdate,'YYYY-MM/w') は、年/月-週 に変換する
('w'は日曜始まりではなく、その月の一日からの経過日数で出される)

TRUNC()

数値型や日付型などを切り詰める関数
TRUNC(hdate,'DAY') は、直前の日曜日の日付に変換する


MySQLweek()と互換性のある方法はわからない

SELECT
    sysdate,
    (TO_CHAR( sysdate+1,'iw' ) - TO_CHAR( TRUNC(sysdate,'MM')+1,'iw' ) + 1)
FROM 
    dual

基本的に、日付の週番号から、その月の1日の週番号を引いて求める。

IWはISO週(年の始まりからの週数)で、週の数え方は月曜始まりになっている。
なので、ISO週を求める前に日付に1を足してごまかす。


1/1は、木曜日よりうしろだと前年度の週番号になってしまう(1/1の週番号が53とかになる)。
ここを解決すればなんとかそれっぽく出来るはず