一意の日時フィールドを持つ postgres テーブルがあります。日時値を引数として取り、渡された日時値に最も近い(しかし等しくない)日時を持つ行IDを返す関数を使用/作成したいと思います。2 番目の引数は、渡された値の前後を指定できます。
理想的には、ネイティブの日時関数を組み合わせることで、この要件を処理できます。それ以外の場合は、カスタム関数にする必要があります。
質問: 行のコレクションに対して相対的な日時を照会する方法は何ですか?
一意の日時フィールドを持つ postgres テーブルがあります。日時値を引数として取り、渡された日時値に最も近い(しかし等しくない)日時を持つ行IDを返す関数を使用/作成したいと思います。2 番目の引数は、渡された値の前後を指定できます。
理想的には、ネイティブの日時関数を組み合わせることで、この要件を処理できます。それ以外の場合は、カスタム関数にする必要があります。
質問: 行のコレクションに対して相対的な日時を照会する方法は何ですか?
select id, passed_ts - ts_column difference
from t
where
passed_ts > ts_column and positive_interval
or
passed_ts < ts_column and not positive_interval
order by abs(extract(epoch from passed_ts - ts_column))
limit 1
passed_ts
はタイムスタンプ パラメータでpositive_interval
あり、ブール パラメータです。true の場合、タイムスタンプ列が渡されたタイムスタンプよりも小さい行のみ。false の場合は逆。
指定された日時の下 (または上) のすべての行を降順 (または昇順) に生成する select ステートメントの最初の行が必要です。
関数本体の擬似コード:
SELECT id
FROM table
WHERE IF(@above, datecol < @param, datecol > @param)
ORDER BY IF (@above. datecol ASC, datecol DESC)
LIMIT 1
ただし、これは機能しません。順序の方向を調整することはできません。
2 番目のアイデアは、両方のクエリを実行し、後で選択することです。
SELECT *
FROM (
(
SELECT 'below' AS dir, id
FROM table
WHERE datecol < @param
ORDER BY datecol DESC
LIMIT 1
) UNION (
SELECT 'above' AS dir, id
FROM table
WHERE datecol > @param
ORDER BY datecol ASC
LIMIT 1)
) AS t
WHERE dir = @dir
datetime 列のインデックスを使用すると、かなり高速になるはずです。
単純に - を使用します。
属性 Key、Attr、および T (タイムゾーンの有無にかかわらずタイムスタンプ) を持つテーブルがあると仮定します。
you can search with
select min(T - TimeValue) from Table where (T - TimeValue) > 0;
これが主な違いになります。この値を同じテーブルへの結合と組み合わせて、関心のあるタプルを取得できます。
select * from (select *, T - TimeValue as diff from Table) as T1 NATURAL JOIN
( select min(T - TimeValue) as diff from Table where (T - TimeValue) > 0) as T2;
それはそれをするべきです
--dmg
次のようなものを試してください:
SELECT *
FROM your_table
WHERE (dt_time > argument_time and search_above = 'true')
OR (dt_time < argument_time and search_above = 'false')
ORDER BY CASE WHEN search_above = 'true'
THEN dt_time - argument_time
ELSE argument_time - dt_time
END
LIMIT 1;