Запрос диапазона дат Rails AR - переход на летнее время - перекрытие

У меня есть приложение Rails 3, как избежать перекрытия из-за перехода на летнее время?

Моя проблема в том, что у меня есть форма для создания отчетов. Проверяя несоответствие, я заметил, что несколько транзакций появляются на неделе, заканчивающейся 11 марта, также появляются на неделе, начинающейся 12 марта.

Проблема сводится к примерно такому ...

Time.zone.parse('2018-03-11').to_datetime.end_of_day.utc
 => Mon, 12 Mar 2018 07:59:59 +0000 
Time.zone.parse('2018-03-12').to_datetime.beginning_of_day.utc
 => Mon, 12 Mar 2018 07:00:00 +0000 

Кажется, что моя проблема заключается в 1-часовом перекрытии выше. При проверке диапазонов дат (см. Фактический код ниже), как я могу избежать этого совпадения.

Актуальный код

Вот собственно код, напоминающий фильтрацию по дате.

  scope :filter_date, lambda { |starts, ends, date, transaction_type = :transaction|
    _scope = scoped


    starts = Time.zone.parse(starts).to_datetime        if starts.class == String and starts.present?
    ends   = Time.zone.parse(ends).to_datetime.tomorrow if ends.class   == String and ends.present?

    begin
      case date
      when 'settled'
        transaction_type == "batch" ? date_field = 'deposited_at' : date_field = 'settled_at'
        _scope = _scope.order('transactions.'+date_field+' DESC')
        _scope = _scope.where("transactions."+date_field+" >= ?", starts) if starts.present?
        _scope = _scope.where("transactions."+date_field+" < ?", ends)   if ends.present?
      else # created, nil, other
        _scope = _scope.order('transactions.created_at DESC')
        _scope = _scope.where("transactions.created_at >= ?", starts) if starts.present?
        _scope = _scope.where("transactions.created_at < ?", ends)   if ends.present?
      end
    end
    _scope
  }

Куча

  • Рубин 2.1
  • Рельсы 3.2
  • PG

Вопрос

Как мне преодолеть это перекрытие времени, когда действует летнее время?

Как вы думаете, почему вам действительно нужно что-то с этим делать? Имейте в виду, что это не ошибка в вашем коде. Это ошибка самого мира. Если смотреть с концептуальной точки зрения, эта транзакция действительно имела место в течение обеих недель :( Если вы все еще абсолютно уверены, что нам нужно что-то с ней сделать, тогда я предложу какое-нибудь решение

AntonTkachov 01.05.2018 14:49

@AntonTkachov Я не знал, что это было так, пока ребята из аккаунтов не подняли флаг, что еженедельные отчеты имеют несоответствие с созданными отчетами. Подведенные итоги еженедельных отчетов были дополнены ежемесячными отчетами.

Ziyan Junaideen 01.05.2018 16:43

Думаю, имеет смысл обсудить с ними, как они справляются с такими несоответствиями на своей стороне. Опишите им проблему и получите отзывы об их видении возможного решения. Потому что ваш код работает нормально и абсолютно логично. А пока подумаю, как с этим справиться :)

AntonTkachov 01.05.2018 23:02

Написал решение. Я надеюсь, ты будешь держать меня в курсе

AntonTkachov 01.05.2018 23:54

Мой ответ тебе помог?

AntonTkachov 03.05.2018 19:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
70
1

Ответы 1

Попробуйте это решение. Я думаю, это должно решить вашу проблему:

scope :filter_date, lambda { |starts, ends, date, transaction_type = :transaction|
  _scope = scoped

  if starts.class == String and starts.present?
    starts = Time.zone.parse(starts)
    starts += 1.hour if starts.dst?
    starts = starts.to_datetime
  end

  if ends.class == String and ends.present?      
    ends = Time.zone.parse(ends) + 1.day
    ends += 1.hour if ends.dst?
    ends = ends.to_datetime
  end

  begin
    case date
    when 'settled'
      transaction_type == "batch" ? date_field = 'deposited_at' : date_field = 'settled_at'
      _scope = _scope.order('transactions.'+date_field+' DESC')
      _scope = _scope.where("transactions."+date_field+" >= ?", starts) if starts.present?
      _scope = _scope.where("transactions."+date_field+" < ?", ends)   if ends.present?
    else # created, nil, other
      _scope = _scope.order('transactions.created_at DESC')
      _scope = _scope.where("transactions.created_at >= ?", starts) if starts.present?
      _scope = _scope.where("transactions.created_at < ?", ends)   if ends.present?
    end
  end
  _scope
}

@Ziyan Junaideen Это вам помогло?

AntonTkachov 17.05.2018 14:03

Другие вопросы по теме