2010-02-17 3 views
1

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

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. Любые идеи относительно того, что я делаю неправильно или что попробовать?

Спасибо!

ответ

0

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

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

Тем временем, я предполагаю, что что-то не настроено на UTC. Где что-то есть набор {операционная система, среда рельсов, dbms}

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

+0

Привет Ларри К. То, что я нашел вчера, что второе событие, один, что я хотел показать DID-шоу для большинства дня и появился больше не будет тока после времени UTC прошло. Например, начиная с 8 вечера по EST, мероприятие больше не было актуальным, но в 5 вечера по восточному стандартному времени это заставляло меня думать, что это проблема часового пояса. Вот результат из журнала разработки для запроса на моем локальном компьютере: SELECT * FROM 'events' WHERE ((Date (start_date) <= '2010-02-17 10:14:10' AND Date (end_date)> = '2010-02-17 10:14:10') AND (events.deleted_at IS NULL ИЛИ events.deleted_at> '2010-02-17 15:14:50')) – aressidi

+0

Я обновил дату_current named_scope, чтобы посмотреть вот так: named_scope: date_current,: conditions => ["Date (start_date) <=? AND Date (end_date)> =?", Time.now.in_time_zone ("UTC"). to_date.to_s, Time. now.in_time_zone ("UTC"). to_date.to_s В журнале появляется следующее: SELECT * FROM 'events' WHERE ((Date (start_date) <= '2010-02-17' AND Date (end_date)> = '2010-02-17') AND (events.deleted_at IS NULL OR events.deleted_at> '2010-02-17 15:22:44')) Возможно, для этого времени часовой пояс должен быть +5 часов вместо -5 часов ... – aressidi

1

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

def find_production_since(start_time) 
    find(:all, :conditions => ["time > ?", start_time.utc]) 
end 
0

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

1

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

named_scope :date_current, :conditions => ["Date(start_date) <= Date(NOW()) AND Date(end_date) >= Date(NOW())"]