この記事について
ruby on railsを学んでいるプログラミング初心者の記事です。
ransackの日付範囲指定検索を導入している最中、SQLログを確認している時に現在の時刻とログの時刻が違い混乱したため備忘録として残しておきます。
環境
mac OS
ruby 3.1.4
Rails 7.0.3.1
gem ransack インストール済み
Docker環境で行っています。
ransackの日付範囲指定
ここで紹介されている[実装]日付選択検索を実装しました。導入方法や詳しいコードの説明は上記の記事をご覧ください。
Ransack.configure do |config|
config.add_predicate 'lteq_end_of_day',
arel_predicate: 'lteq',
formatter: proc { |v| v.end_of_day }
end
<div class="d-inline me-1">
<%= f.date_field :created_at_gteq, class: 'form-control' %>
</div>
<div class="d-inline me-1">
<span>~</span>
</div>
<div class="d-inline me-3">
<%= f.date_field :created_at_lteq_end_of_day, class: 'form-control' %>
</div>
ログ確認方法とSQLクエリの日時が違う理由
実際にどういうSQLクエリが行われているかログを見て確認します。
開発環境でリアルタイムにログを見るコマンドは以下になります。
tail -f log/development.log
テスト環境であればtest.log
本番環境であればproduction.log
このように選択して検索をかけました。
リアルタイムに出力されたログの中身をみると、
SELECT DISTINCT `boards`.* FROM `boards` WHERE (`boards`.`created_at` >= '2025-08-26 15:00:00' AND `boards`.`created_at` <= '2025-08-28 14:59:59.999999') LIMIT 20 OFFSET 0
(ログ一部抜粋)
created_at >= '2025-08-26 15:00:00' AND created_at <= '2025-08-28 14:59:59.999999'
となっており、27日から28日で検索をかけたのにも関わらず、WHERE句の日時が26日15時00分00秒から28日14時59分59.999999秒で検索されています。
これはタイムゾーンの影響によるもので、表示されている時刻はUTC時間になります。
UTCはUniversal time coordinatedの略であり、世界の時計の基準です。
日本時間はそこから+9時間とされており、この世界基準から9時間早いため、
2025-08-27 00:00:00から9時間早い2025-08-26 15:00:00で検索されているのです。
ついでにDBのタイムスタンプもコンソール内で見てみましょう。
9月12日にBoardを新規作成後、Board.last
で最新のBoardを取得しています。
irb(main):001:0> Board.last
Board Load (10.4ms) SELECT `boards`.* FROM `boards` ORDER BY `boards`.`id` DESC LIMIT 1
=>
#<Board:0x0000ffffb1b4dfc8
id: 33,
title: "a",
body: "a",
user_id: 19,
created_at: Thu, 11 Sep 2025 14:30:53.987588000 JST +09:00,
updated_at: Thu, 11 Sep 2025 14:30:53.987588000 JST +09:00,
9月11日と記録されていますが、JST +09:00と記載することで標準時間から日本時間を表しています。
つまり、システムが自動的に検索または登録された日時から世界基準の地域ごとの時刻を逆算して世界の標準時間として登録しているのです。
時刻関連のログをみるときは混乱しないよう注意しましょう。
参考