1

PostgreSQL には、イベントの開始時刻と終了時刻を「15:00-17:00」という形式で表す値を含むテキスト列があります (たとえば、午後 3 時に開始して午後 5 時に終了するイベントです)。イベントがまだ終了していない行を返す SQL クエリを作成する必要があります。たとえば、16:48 にクエリを実行すると、まだ 17:00 になっていないため、上記のイベントが返されます。それが役立つ場合、私は時間の値だけに関心があります。分は無視できます。

データが適切な時間フィールドにある場合、これは些細なことですが、データがテキストの場合の方法については少し困惑しています。何らかの正規表現を使用して 2 時間目の値だけを解析し、それを CURRENT_TIME と組み合わせて何らかの比較を行うことができると思いますが、すべてをまとめる方法がよくわかりません。

誰でも私を助けることができますか?

4

2 に答える 2

1
SELECT *
FROM   tbl
WHERE  now()::time BETWEEN left(time_col, 5)::time
                   AND    right(time_col, 5)::time

tblこれは、現在の現地時間 now()::timeが begin と end の間にあるtable のすべての行を列にエンコードして返しますtime_col。つまり、それらは開始されていますが、まだ終了していません。time_colこれには明らかに、質問のパターンと正確に一致する整形式の文字列が必要です。

left()right()PostgreSQL 9.1 で導入されましたsubstr()古いバージョンでは、すでに提供されている @lserni のような式に置き換えることができます。

于 2012-10-21T22:30:05.360 に答える
0

疑似日付フィールドとのテキスト比較を使用できます。議事録は辞書順であるため、議事録を確認することもできます。

... WHERE SUBSTR(datefield, 7, 5) >= to_char(NOW(), 'HH24:MI');

または多分

... WHERE split_part(datefield, '-', 2) >= to_char(NOW(), 'HH24:MI');

「17:00 to 23:00」などの場合に備えて、正規表現で確認することもできます。

... WHERE substring(datefield from '\d\d:\d\d$') >= to_char(NOW(), 'HH24:MI')
    AND   substring(datefield from '^\d\d:\d\d') <= to_char(NOW(), 'HH24:MI');

この最後のチェックでは、不適切な形式の日付が自動的に無視されます。

于 2012-10-21T21:52:30.173 に答える