簡體   English   中英

如何正確轉換或查詢Rails / MySQL DateTime列的日期范圍

[英]How to Properly Convert or Query Date Range for Rails / MySQL DateTime Column

我有一個rails應用程序,我將created_at存儲為datetime(標准)。 我正在構建一個搜索表單,我發現我必須使用find_by_sql來執行一些復雜的子查詢。 表單有一個日期范圍(沒有時間)來搜索items_at字段的項目。

我發現的問題是,如果我只傳入范圍的日期字符串來查詢...

... status_changes.created_at between '2009-01-24' and '2009-03-12' ...

我收回了創建日期為2009-01-23 17:10:39 -0800的記錄,因為它存儲在數據庫中,如2009-01-24 01:10:39(UTC)

我如何解決這個問題,以便結果不會返回有問題的記錄?

我似乎需要將日期范圍轉換為UTC特定的,或者告訴find_by_sql根據當前時區進行搜索,而不是將列讀取為utc ...

任何接受者?

約翰

現代ActiveRecord的做法是:

Model.where(time_field: date1..date2)

如果您不使用find_by_sql ,而是使用帶有:conditions子句的find ,讓Rails進行替換,它將自動轉換所有內容。

Model.find :all, 
  :conditions => ["created_at between ? and ?", start_date, end_date]

最糟糕的情況是,如果Rails被日期混淆,你可以將它們轉換為時間,它應該很好地運行:

Model.find :all, 
  :conditions => ["created_at between ? and ?", 
                   start_date.to_time, end_date.to_time]

我知道這是一個老問題,但在回答有關CONVERT_TZ的Streamlines查詢時:

除非您加載了mySQL命名的時區表(這在vanilla安裝上很不可能),否則您需要輸入時區作為UTC的偏移量。

CONVERT_TZ(status_changes.created_at, '+00:00', '+08:00') between '2009-01-24' and '2009-03-12')

MySQL有一個CONVERT_TZ函數,它接受一個日期時間並將其從一個時區轉換為另一個時區。 您可以構建查詢以將存儲值(UTC)轉換為本地時區(PST)。

CONVERT_TZ(status_changes.created_at,'UTC',?) between ? and ?, 'PST, '2009-01-24', '2009-03-10'

我嘗試了伊恩的答案,但它並沒有奏效。 當保存和加載記錄時,Rails正確處理時區,但對查詢參數似乎不一樣。 請注意,我正在使用的應用程序是在Rails 2.1.1中,所以從那以后事情可能會有所改善。

通過一個小的調整,我能夠使Ian的解決方案工作:使用getutc方法獲取UTC時區中的時間值,然后將其作為參數傳遞。 這也不會對任何可能正確處理時間參數區域的Rails版本造成任何傷害,因為getutc不會改變UTC時間,只會改變時區。

因為Rails在數據庫中以UTC格式存儲日期,所以您應該在TimeDateTime上使用utc方法

Model.find :all, 
  :conditions => ["created_at between ? and ?", start_date.utc, end_date.utc]
Model.where(:from => "2012-01-01".to_date.."2012-06-30".to_date)

為我工作(:來自'日期'類型的數據庫字段)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM