このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/965
#  休憩時間が設定されているときに、指定日時より'HH:MM'後の時刻を求めたいです。 
#   
#  ・データベース:PostgreSQL 8.4 
#  ・テーブル: 
#  休憩時間 
#  開始時刻 終了時刻 
#  08:00 08:30 
#  19:00 19:30 
#  22:00 22:30 
#   
#  使うかどうかわかりませんが、次のマスタもあります。 
#  カレンダー 
#  日付 
#  ... 
#  2012-07-26 
#  2012-07-27 
#  2012-07-28 
#  ... 
#   
#  ・説明 
#  指定した日時から休憩時間を除いた'HH:MM'後を計算します。 
#  計算結果が休憩時間内(開始終了時刻を含む)の場合は、休憩時間終了時刻を結果とします。 
#   
#  ・欲しい結果 
#  '2012-07-27 09:00'の'09:00'後 => '2012-07-27 18:00'(休憩時間がないのでそのまま足す) 
#  '2012-07-27 09:00'の'10:00'後 => '2012-07-27 19:30'(10時間後は19:00の休憩と重なるので、19:30が答え) 
#  '2012-07-27 09:00'の'11:00'後 => '2012-07-27 20:30' 
#  '2012-07-27 09:00'の'13:00'後 => '2012-07-27 23:00'(19:00〜と22:00〜の二回の休憩を挟む) 
# 
# 

'指定した日時から休憩時間を除いたHH:MM後を計算します。計算結果が休憩時間内(開始終了時刻を含む)の場合は、休憩時間終了時刻を結果とします。'(_起点時刻,_時間後,_時間後の時刻) :-
        休憩時間ならびと就業時間ならびを生成する(_休憩時間ならび,_就業時間ならび),
        最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす(_休憩時間ならび,_起点時刻,_時間後,_更新された起点時刻,_更新された時間後),
        次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_更新された起点時刻,_最後の休憩終了時刻,_更新された時間後,_就業時間ならび,_時間後の時刻).

休憩時間ならびと就業時間ならびを生成する(_就業時間ならび) :-
        findall([_開始時刻,_終了時刻],(
                    休憩時間(_開始時刻,_終了時刻)),
                _休憩時間ならび),
        就業時間ならびを生成する(L,_就業時間ならび).

就業時間ならびを生成する([],[]).
就業時間ならびを生成する([[A,B],[C,D]|R1],[[B,C]|R2]) :-
        就業時間ならびを生成する([[C,D]|R1],R2).

最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([],_起点時刻,_時間後,0,_時間後の時刻) :-
        _時間後の時刻 is _起点時刻 + _時間後,!.
最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([[_休憩起点時刻,_休憩終了時刻]|R1],_起点時刻,0,_時間後の時刻) :-
        _休憩起点時刻 @>= _起点時刻,
        時間の引き算(_休憩起点時刻,_起点時刻,_休憩起点時刻までの時間),
        _休憩起点時刻までの時間 @>= _時間後,
        時間の足し算(_起点時刻,_時間後,_時間後の時刻),!.
最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([[_休憩起点時刻,_休憩終了時刻]|R1],_起点時刻,_更新された時間後,_休憩終了時刻) :-
        _休憩起点時刻 @>= _起点時刻,
        時間の引き算(_休憩起点時刻,_起点時刻,_休憩起点時刻までの時間),
        _休憩起点時刻までの時間 @< _時間後,
        時間の引き算(_時間後,_休憩起点時刻までの時間,_更新された時間後),!.
最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす([[_休憩起点時刻,_休憩終了時刻]|R1],_起点時刻,_時間後,_更新された時間後,_更新された時間後時刻) :-
        \+(_休憩起点時刻 @>= _起点時刻),
        最初に一番間近な休憩時刻までの時間を時間後から差し引き起点をその休憩後時刻にずらす(R1,_起点時刻,_時間後,_更新された時間後,_更新された時間後時刻).
        

次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_時間後の時刻,_,0,_,_時間後の時刻) :- !.
次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_,_時間後,[],_時間後の時刻) :-
        時間の足し算(_起点時刻,_時間後,_時間後の時刻),!.
次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_,_時間後,[[A,B]|R1],_時間後の時刻) :-
        時間の引き算(B,A,_次の就業時間枠),
        _時間後 @=< _次の就業時間枠,
        時間の足し算(A,_時間後,_時間後の時刻),!.
次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_最後の休憩終了時刻,_時間後,[[A,B]],_時間後の時刻) :-
        時間の引き算(B,A,_次の就業時間枠),
        時間の引き算(_時間後,_次の就業時間枠,_更新された時間後),
        時間の足し算(_最後の休憩終了時刻 +_時間後,_時間後の時刻),!.
次の就業時間の始まりまでの間の就業時間を時間後から削っていく(_起点時刻,_最後の休憩終了時刻,_時間後,[[A,B],[C,D]|R1],_時間後の時刻) :-
        時間の引き算(B,A,_次の就業時間枠),
        時間の引き算(_時間後,_次の就業時間枠,_更新された時間後),
        時間の足し算(C,_時間後,_時間後の時刻),!.