このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/662
#  MySQL5 
#   
#  開始日、終了日を持ったテーブルを日付単位に表示したいです。 
#  tbl_job は、以下の構造です。 
#   
#  id, name, start_date, end_date 
#  --------------------------- 
#  1, JOB1, 2012-04-01, 2012-04-03 
#  2, JOB2, 2012-04-02, 2012-04-04 
#   
#  上記テーブルから以下のように日付単位でJOBを表示するSQLを教えてほしいです。 
#   
#  date, id, name 
#  -------------------- 
#  2012-04-01, 1, JOB1 
#  2012-04-02, 1, JOB1 
#  2012-04-02, 2, JOB2 
#  2012-04-03, 1, JOB1 
#  2012-04-03, 2, JOB2 
#  2012-04-04, 2, JOB2 
# 
# 

'開始日、終了日を持ったテーブルを日付単位に表示したい' :-
        日付単位tbl_jobの生成(_日付単位tbl_jobならび),
        findsetof(_日付,(
                    member([_date,_,_],_日付単位tbl_jobならび)),
                _日付ならび),
        日付単位に表示する(_日付ならび,_日付単位tbl_jobならび).

日付単位tbl_jobの生成(_日付単位tbl_jobならび) :-
        findall(_日付,(
                    tbl_job(_id,_name,_start_date,_end_date),
                    日付の生成(_start_date,_end_date,_日付)),
                _日付単位tbl_jobならび).

日付の生成(_終了年-_終了月-_終了日,_終了年-_終了月-_終了日,_終了年-_終了月-_終了日) :- !.
日付の生成(_開始年-_開始月-_開始日,_終了年-_終了月-_終了日,_開始年-_開始月-_開始日).
日付の生成(_開始年-_開始月-_開始日,_終了年-_終了月-_終了日,_年-_月-_日) :-
        翌日(_開始年,_開始月,_開始日,_翌日年,_翌日月,_翌日日),

        日付の生成(_翌日年-_翌日月-_翌日日,_終了年-_終了月-_終了日,_年-_月-_日).
翌日(_年,12,31,_翌年,1,1) :- !.
翌日(_年,_月,30,_年,_翌月,1) :-
        member(_月,[4,6,9,11]),
        _翌月 is _月 + 1,!.
翌日(_年,_月,31,_年,_翌月,1) :-
        _翌月 is _月 + 1,!.
翌日(_年,2,29,_年,3,1) :- !.
翌日(_年,2,28,_年,3,1) :-
        \+(うるう年(_年)),
翌日(_年,_月,_日,_年,_月,_翌日) :-
        _翌日 is _日 + 1.

うるう年(_年) :-
        0 is _年 mod 400,!.
うるう年(_年) :-
        0 is _年 mod 100,!,
        fail.
うるう年(_年) :-
        0 is _年 mod 4,!.
うるう年(_年) :-
        \+(0 is _年 mod 4),
        fail.

日付単位に表示する(_日付ならび,_日付単位tbl_jobならび) :-
        member(_日付,_日付ならび),
        member([_日付,_id,_name],_日付単位tbl_jobならび),
        日付の形式を整えながら一行表示する(_日付,_id,_name),
        fail.
日付単位に表示する(_日付ならび,_日付単位tbl_jobならび).

日付の形式を整えながら一行表示する(_年-_月-_日,_id,_name) :-
        swritef(S,'%2r-%2r-%2r',[_年-_月-_日]),
        空白を0に置換した日付文字列(S,_空白を0に置換した日付文字列),
        writef('%t, %t, %t\n',[_空白を0に置換した日付文字列,_id,_name).

空白を0に置換した日付文字列(S,_空白を0に置換した日付文字列) :-
        findall(_文字_2,(
                    sub_atom(S,_,1,_,_文字),
                    空白を0に置換(_文字,_文字_2)),
               _空白を0に置換した日付文字列).

空白を0に置換(' ','0') :- !.
空白を0に置換(A,A).