4

一意の日時フィールドを持つ postgres テーブルがあります。日時値を引数として取り、渡された日時値に最も近い(しかし等しくない)日時を持つ行IDを返す関数を使用/作成したいと思います。2 番目の引数は、渡された値の前後指定できます。

理想的には、ネイティブの日時関数を組み合わせることで、この要件を処理できます。それ以外の場合は、カスタム関数にする必要があります。

質問: 行のコレクションに対して相対的な日時を照会する方法は何ですか?

4

6 に答える 6

4
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 の場合は逆。

于 2013-05-01T16:25:55.920 に答える
1

指定された日時の下 (または上) のすべての行を降順 (または昇順) に生成する 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 列のインデックスを使用すると、かなり高速になるはずです。

于 2013-05-01T16:41:59.437 に答える
1

単純に - を使用します。

属性 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

于 2013-05-01T16:21:32.340 に答える
0

次のようなものを試してください:

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;
于 2013-05-01T16:29:29.200 に答える