0

日付範囲を選択し、クエリを実行してその範囲内の注文を確認する UI があります。

したがって、受け入れられる有効な形式は次のとおりです。

a) 2013-04-01 17:00:00 - 2013-04-16 18:00:00

b) 2013-04-01 17:00:00 - 2013-04-16

c) 2013 年 4 月 1 日 - 2013 年 4 月 16 日

それを ruby​​ で分割して、start_date と end_date を指定しました。SQLクエリの準備ができているので、開始時間に触れる必要はありません。

created_at BETWEEN '2013-04-01 17:00:00' AND '2013-04-16'しかし、範囲指定クエリを実行しても、結果セットに含まれる必要がある 16 日の結果が得られないため、end_date を変更する必要があります。(2013-04-16 00:00:00 との比較)

これが実用的な解決策です、私は思いつきました

end_date = Time.parse(end_date).strftime("%T")=="00:00:00" ? (end_date.to_s) + " 23:59:59" : end_date.to_s

上記は非常に紛らわしいように見えるので、これを行うためのより良い方法はありますか? (検索または 1 ~ 2 行の回答、それ以上ではありません)

4

1 に答える 1

4

DateTime.parse(str)次の方法を使用できます。

date_str = "2013-04-16"
date = DateTime.parse(date_str)
#=> Tue, 16 Apr 2013 00:00:00 +0000

date_time_str = "2013-04-16 18:00:00"
date = DateTime.parse(date_time_str)
#=> Tue, 16 Apr 2013 18:00:00 +0000

.hour次に、 (または.minute) をテストし、 時間が選択されていない場合end_dateに を設定できます。end_of_day

end_date = (date.hour == 0 && date.minute == 0) ? date.end_of_day : date

少し改善:解析された日付がこの日付の始まり (時間/分/秒なし) と等しいかどうかをテストできます。

date = DateTime.parse("2013-12-12")
#=> Thu, 12 Dec 2013 00:00:00 +0000
date.beginning_of_day
#=> Thu, 12 Dec 2013 00:00:00 +0000
end_date = (date.beginning_of_day == date) ? date.end_of_day : date
#=> Thu, 12 Dec 2013 23:59:59 +0000

ユーザーが のような DateTime を入力したときの問題を解決するには、文字列に ' ' の部分が含まれているかどうかを確認するために2013-04-16 00:00:00使用できます。.include?00:00:00

date_str = "2013-04-16 00:00:00"
date = DateTime.parse(date_str)

end_date = date if date_str.include?('00:00:00') # means the user explicitly wants the time at 00:00 and 00 second
end_date ||= (date.beginning_of_day == date) ? date.end_of_day : date # set end_date if end_date.nil?
于 2013-05-28T19:11:24.813 に答える