Сравнение дат в Rails - PullRequest
       1

Сравнение дат в Rails

1 голос
/ 17 февраля 2010

У меня проблемы со сравнением дат в именованной области. Я пытаюсь определить, является ли событие текущим, основываясь на его дате начала и окончания. Вот названная область действия, которую я использую, какие виды работ, но не для событий, имеющих одинаковую дату начала и окончания.

named_scope :date_current, :conditions => ["Date(start_date) <= ? AND Date(end_date) >=  ?", Time.now, Time.now]

Возвращает следующую запись, хотя она должна возвращать две записи, а не одну ...

>> Event.date_current
=> [#<Event id: 2161, start_date: "2010-02-15 00:00:00", end_date: "2010-02-21 00:00:00", ...]

То, что он не возвращает, это тоже

>> Event.find(:last)
=> #<Event id: 2671, start_date: "2010-02-16 00:00:00", end_date: "2010-02-16 00:00:00", ...>

Серверное время, похоже, указано в формате UTC, и я предполагаю, что записи хранятся в БД в формате UTC. Есть идеи о том, что я делаю не так или что попробовать?

Спасибо!

Ответы [ 4 ]

1 голос
/ 27 сентября 2012

Это может помочь вам.

named_scope :date_current, :conditions => ["Date(start_date) <= Date(NOW()) AND Date(end_date) >=  Date(NOW())"]
1 голос
/ 18 апреля 2010

Я боролся с той же проблемой. Записи хранятся в UTC, но значение utc не вставляется в запрос. Я решил это, как и вы, преобразовав его в utc вручную, например, time.utc .

def find_production_since(start_time)
    find(:all, :conditions => ["time > ?", start_time.utc])
end
1 голос
/ 17 февраля 2010

Самый простой способ отладки - это посмотреть в журнале rails, чтобы увидеть точно , какой SQL-оператор генерируется Rails.

Затем опубликуйте sql, если проблемы все еще есть.

Между тем, я предполагаю, что что-то не установлено в UTC.Где-то находится набор {операционная система, среда rails, dbms}

Добавлено: Кроме того, почему вы сравниваете «Date» (в dbms) со значениями «Time» (из вашего утверждения)?Лучше, чтобы классы типов совпадали явно.Я использую стандарт нового дня, имеет компонент времени 00:00:00.Таким образом, вы можете сравнить с БД без необходимости использования функции даты в вашем SQL.

0 голосов
/ 21 апреля 2010

Вместо использования Time.now (а затем трудоемкого преобразования в дату согласно вашему второму комментарию) вы можете просто использовать Date.today, который вставит «2010-04-20» в ваш SQL и должен сравниваться с датой (start_date), не беспокоясь о времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...