-- time intervals to be summed up -- 6/4 18:00-20:30 -- 6/8 13:30-14:30, 15:00-17:05 select sum(times[2] - times[1]) from concat(' -- 6/4 18:00-20:30 -- 6/8 13:30-14:30, 15:00-17:05 '), cast( regexp_matches(concat, '(\d+:\d+)-(\d+:\d+)', 'g') as time[] ) as times; +----------+ | sum | +----------+ | 05:35:00 | +----------+ (1 row)
テンプレは次のとおり。時刻は
select sum(times[2] - times[1]) from concat(' メモした時間帯を含むテキストを、ここにペースト '), cast( regexp_matches(concat, '(\d+:\d+)-(\d+:\d+)', 'g') as time[] ) as times;
簡単な内容ですが、順を追って説明すると。
(1)テキストをクエリに突っ込む。改行・タブがあっても問題なくて便利。
select * from concat(' -- 時間帯を含むメモ部分 -- 6/4 18:00-20:30 -- 6/8 13:30-14:30, 15:00-17:05 '); +---------------------------------+ | concat | +---------------------------------+ | +| | +| | -- 時間帯を含むメモ部分 +| | -- 6/4 18:00-20:30 +| | -- 6/8 13:30-14:30, 15:00-17:05+| | +| | | +---------------------------------+ (1 row)
(2)テキストから正規表現で時間帯を抽出。パターンを、メモした形式に合わせて適宜修正します。regexp_matches
select reg from concat(' -- 6/4 18:00-20:30 -- 6/8 13:30-14:30, 15:00-17:05 '), regexp_matches(concat, '(\d+:\d+)-(\d+:\d+)', 'g') as reg; +---------------+ | reg | +---------------+ | {18:00,20:30} | | {13:30,14:30} | | {15:00,17:05} | +---------------+ (3 rows)
(3)regexp_matches
select times[1], times[2] from concat(' -- 6/4 18:00-20:30 -- 6/8 13:30-14:30, 15:00-17:05 '), cast( regexp_matches(concat, '(\d+:\d+)-(\d+:\d+)', 'g') as time[] ) as times; +----------+----------+ | times | times | +----------+----------+ | 18:00:00 | 20:30:00 | | 13:30:00 | 14:30:00 | | 15:00:00 | 17:05:00 | +----------+----------+ (3 rows)
ここまで来れば簡単。2
select sum(終了時間 - 開始時間) from ...
PostgreSQL