このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1274791771/502
#  元データの日付(スケジュールとかログの日付)を全件検索するとします。 
#  その時、「その時刻より後の18時」を取得(生成)するうまい方法はあるでしょうか。 
#  言い換えると、日付の繰り上がりに対して小技があったら教えてください。 
#   
#  ターゲットデータベースはH2Databaseですが、「Oracleならこんな方法が(ry」とかでも 
#  勉強になりますのでお願いします。 
#   
#  元データ 
#  ------------------- 
#  2010-10-01 01:00:00 
#  2010-10-03 17:00:00 
#  2010-10-04 20:00:00 
#  ------------------- 
#   
#  欲しいデータ 
#  ------------------- 
#  2010-10-01 01:00:00 2010-10-01 18:00:00 
#  2010-10-03 17:00:00 2010-10-03 18:00:00 
#  2010-10-04 20:00:00 2010-10-05 18:00:00 
#  ------------------- 
# 

'元データの日付(スケジュールとかログの日付)を全件検索するとします。その時、「その時刻より後の18時」を取得(生成)する'(_欲しいデータ) :-
        データベース(_元のデータ),
        次の18時の時刻文字列表現(_元のデータ,_次の18時の時刻文字列表現),
        concat_atom([_元のデータ,' ',_次の18時の時刻文字列表現],_欲しいデータ).

次の18時の時刻文字列表現(_時刻文字列表現,_次の18時の時刻文字列表現) :-
        時刻文字列表現から年、月、日、時、分、秒を得る(_時刻文字列,_年,_月,_日,_時,_分,_秒),
        _時 < 18,
        write_formatted_atom(_次の18時の時刻文字列表現,'%4d-%02d-%02d 18:00:00',[_年,_月,_日]),!.
次の18時の時刻文字列表現(_時刻文字列表現,_次の18時の時刻文字列表現) :-
        翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日),
        write_formatted_atom(_次の18時の時刻文字列表現,'%4d-%02d-%02d 18:00:00',[_翌日の年,_翌日の月,_翌日の日]),!.

時刻文字列表現から年、月、日、時、分、秒を得る(_時刻文字列,_年,_月,_日,_時,_分,_秒) :-
        split(_時刻文字列,[' ','-',':'],[_年,_月,_日,_時,_分,_秒]),
        _時 < 18.

翌日(_翌日の年整数,1,31,_翌日の年整数,2,1) :- !.
翌日(_翌日の年整数,3,31,_翌日の年整数,4,1) :- !.
翌日(_翌日の年整数,4,30,_翌日の年整数,5,1) :- !.
翌日(_翌日の年整数,5,31,_翌日の年整数,6,1) :- !.
翌日(_翌日の年整数,6,30,_翌日の年整数,7,1) :- !.
翌日(_翌日の年整数,7,31,_翌日の年整数,8,1) :- !.
翌日(_翌日の年整数,8,31,_翌日の年整数,9,1) :- !.
翌日(_翌日の年整数,9,30,_翌日の年整数,10,1) :- !.
翌日(_翌日の年整数,10,31,_翌日の年整数,11,1) :- !.
翌日(_翌日の年整数,11,30,_翌日の年整数,12,1) :- !.
翌日(_翌日の年整数,2,28,_翌日の年整数,3,1) :- \+(うるう年(_翌日の年整数)),!.
翌日(_翌日の年整数,2,29,_翌日の年整数,3,1) :- うるう年(_翌日の年整数),!.
翌日(_年整数,12,31,_翌日の年整数,1,1) :-
        _翌日の年整数 is _年整数 + 1,!.
翌日(_翌日の年整数,_翌日の月整数,_日整数,_翌日の年整数,_翌日の月整数,_翌日の日整数) :-
        _翌日の日整数 is _日整数 + 1,!.