1

私はデータベースに次のようなレコードを保存しています:

ID| date_column
1 | 2013-02-10 10:00:00
2 | 2013-02-10 11:00:00
3 | 2013-02-10 12:00:00
4 | 2013-02-10 13:00:00
5 | 2013-02-11 14:00:00
6 | 2013-02-11 22:00:00

今日の日付に最も近い 3 つのレコードを取得しようとしています。たとえば、今日が2013-02-10であると仮定すると、今日の日付 ( 2013-02-10 11:00:002013-02-10 12:00:002013-02-10 13:00:00) を持つ 3 つのレコードを取得する必要がありますが、たとえば今日が の場合2013-02-15、最も近い 3 つのレコード (この場合2013-02-10 13:00:00は 、2013-02-11 14:00:00および2013-02-11 22:00:00? ) を取得する必要があります。

どうすればいいですか?

ありがとうございました

4

2 に答える 2

1

ActiveRecordを使用していると仮定しますか?

このクエリは、過去の「現在」に最も近い3つの日付を取得します。

time_to_check = Time.now
TableObjectName.where("date_column <= ?", time_to_check ).limit(3).order("date_column desc")

このクエリは、将来の「現在」に最も近い3つの日付を取得します。

TableObjectName.where("date_column >= ?", time_to_check ).limit(3).order("date_column desc")

私が考えることができる唯一のことであり、これは非効率的ですが、これを行うSQLの方法は考えられません。これで、基本的に6つのレコードを持つ2つの配列ができました。

将来の3つ(ある場合)過去の3つ(ある場合)。

次に、それぞれをループして、変数の各レコード間で経過した時間を比較しtimeToCheckます。

時間差が最も小さい3つのうち、それらを最終的な配列に追加します。

于 2013-02-26T23:40:53.900 に答える
0

これにより、目標日の正午を使用して、特定の時間に 3 つの終値が得られます。これにより、今日の結果が他のどの日よりも早く得られるようになります。

TableObjectName.all(order: "abs(timediff('2013-02-10 12:00:00', date_column))", limit: 3).
于 2013-02-27T01:39:30.170 に答える