0

created_atフェッチするクエリを作成し、タイムゾーンの日付ですべてのレコードをカウントする必要があります。

def total_by_date(my_date)    
  where{created_at <= my_date}.count
end

created_attimestampPostgreSQL では UTCとして保存されますがmy_date、Rails のアプリケーション タイム ゾーンの日付です。

タイムゾーンの変換による損失なしに、どのように正しい方法で行うことができ、created_at最初に日付に変換する必要がありますか?

4

1 に答える 1

1

Date単純な 'olオブジェクトの大きな問題は、時間情報が含まれていないことです。したがって、現在のクエリでは、クエリが次のように解決されるため、指定された日付の前にすべてを取得することになりますWHERE created_at <= '2013-09-27'...。レコードを失うことなくこの問題を回避する方法の 1 つは、次のように日付オブジェクトに 1 日を追加することです。

def total_by_date(my_date)    
    where{created_at <= (my_date + 1.day)}.count
end

この方法でも、タイムゾーンについてまったく心配する必要はありません。日付部分を見ているだけです。

**編集**

コメントであなたの質問に答えて:

なぜ+ 1.day機能するかについては、次のような日付を考えてみてください。クエリのmy_dateように見え2013-09-24ますが、基本的には と同じ2013-09-24 00:00:00です。これは、9 月 24 日の午前 0 時に設定された日時/タイムスタンプと同じです。したがって、平易な英語で言えば、「9 月 24 日の午前 0 時までにすべてを教えてください」という比較であれば、到達するすべての結果が得られます。その特定の日時より前に存在するものはありますが、9 月 24 日の後半に発生したものは表示されません。

したがって、+ 1.day同じ「問題」が依然として存在しますが、クエリが「9 月 25 日午前 0 時またはそれ以前の何か」であるため、現在は有利に機能しています。

注:技術的には、たまたま 9 月 25 日の真夜中に作成されたものに対して望ましくない一致が発生する可能性がありますが、その問題を修正する<代わりに単純に比較を簡単に変更できます。<=

于 2013-09-27T15:05:59.713 に答える