2

レガシーデータベースで実行されている Sequel を使用して Ruby プログラムを作成しています。異なる日時形式を扱う際に問題があります。

DBには列を持つテーブルがありますstart_date。Sequel の移行スクリプトでは、SQLiteDateTimeの型であるに設定しましたがtimestamp、レガシー データの時間形式は異なります。

  • のように ISO8601 を使用しているものもあり2013-09-01T08:28:00+10:00ます。
  • のような名前があるかどうかはわかりませんが、別のものを使用している人もい2013-09-01 08:28:00.000000+1000ます。

問題は、テーブルに対してクエリを実行して でフィルター処理しようとするとstart_date、2 つの日時形式の違いによって誤った結果が生じることです。

私が使用しているクエリは次のとおりです。

current = Time.now
MyModel.where { start_date < current }

Sequel は、次のように SQL に変換します。

SELECT * FROM `my_model` WHERE `start_date` < '2013-09-01 08:28:00.000000'

私のローカル テストでは、Sequel は日付を文字列として比較しているように見えるため2013-09-01 08:28:00.000000+10002013-09-01T01:28:00+10:00. 空白がTこれよりも少ないため、私が望むものではありません。

iso8601次のような時間を使用できます。

current_iso8601 = Time.now.iso8601
MyModel.where { start_date < current_iso8601 }

しかし、データベースには 2 つの異なる日時形式があるため、問題は解決しません。

私の質問は次のとおりです。

  • Ruby/Sequel は、文字列ではなく日付/時刻によるデータベースのクエリをサポートしていますか?
  • さまざまな日時形式で機能しますか?
  • SQLite はローカル テスト用であり、本番環境では MySQL になります。そのため、ソリューションは一般的な Sequel メソッドをアダプターとして使用する必要があり、データベース固有のメソッドは使用しないでください。

注: プログラムは Rails アプリケーションではありません。

どうもありがとうございました!

4

1 に答える 1

3

SQLite には日付/時刻型がありません ( http://sqlite.org/datatype3.htmlを参照)。日時値を文字列として格納します。

最善の解決策は、本番環境で使用するのと同じデータベースを開発/テストで使用することです。それをしたくない場合は、すべての SQLite 日時値を変換して、すべて同じ ISO8601 形式を使用するようにする必要があります。そうすれば、比較演算子は正しく機能します (MySQL の場合と同様)。

于 2013-08-29T16:43:29.570 に答える