Альтернатива strftime в postgres db - PullRequest
0 голосов
/ 20 января 2019

Вот моя проблема:

В этой конкретной таблице хранится информация о посещениях, совершенных клиентами до сих пор

Контроллер дохода (базовое суммирование) - по дням / месяцам / годам

def index
 @days = Visit.select("start_time,SUM(price) as price").group("strftime('%Y-%m-%d', start_time)").where(:start_time => DateTime.now.beginning_of_month..DateTime.now.end_of_month).where(:status => true).order('start_time DESC').all
 @months = Visit.select("start_time,SUM(price) as price").group("strftime('%Y-%m', start_time)").where(:status => true).order('start_time DESC').all
 @years = Visit.select("start_time,SUM(price) as price").group("strftime('%Y', start_time)").where(:status => true).order('start_time DESC').all
 @total = 0
 @years.collect { |x| @total = @total + x.price }
end

Переключение на Postgres из sqlite сделало невозможным использование strftime - я попытался изменить его на что-то вроде этого:

 @days = Visit.select("to_char(start_time, 'YYYY-MM-DD'),SUM(price) as price").group("to_char(start_time,'YYYY-MM-DD')").where(:start_time => DateTime.now.beginning_of_month..DateTime.now.end_of_month).where(:status => true).order("to_char(start_time,'YYYY-MM-DD') DESC").all
 @months = Visit.select("to_char(start_time, 'YYYY-MM'),SUM(price) as price").group("to_char(start_time,'YYYY-MM')").where(:status => true).order("to_char(start_time,'YYYY-MM') DESC").all
 @years = Visit.select("to_char(start_time, 'YYYY'),SUM(price) as price").group("to_char(start_time,'YYYY')").where(:status => true).order("to_char(start_time,'YYYY') DESC").all

Но теперь я получаю ошибку

отсутствует start_time

в представлении:

 <table class="table table-hover table-striped table-bordered">
  <thead>
  <tr>
    <th class="text-center">Time period</th>
    <th class="text-center">Sum</th>
  </tr>
  </thead>
  <tbody>
  <tr>
    <th colspan="2">days</th>
  </tr>
  <% @days.each do |s| %>
      <tr>
        <td><%= s.start_time.strftime('%d.%m.%Y') %></td>
        <td class="text-right"><%= s.price %> eur</td>
      </tr>
  <% end %>
  <tr>
    <th colspan="2">months</th>
  </tr>
  <% @months.each do |s| %>
      <tr>
        <td><%= s.start_time.strftime('%m.%Y') %></td>
        <td class="text-right"><%= s.price %> eur</td>
      </tr>
  <% end %>
  <tr>
    <th colspan="2">years</th>
  </tr>
  <% @years.each do |s| %>
      <tr>
        <td><%= s.start_time.strftime('%Y') %>r</td>
        <td class="text-right"><%= s.price %> eur</td>
      </tr>
  <% end %>
  <tr>
    <th class="text-right">All</th>
    <td class="text-right"><%= @total %> eur</td>
  </tr>
  </tbody>
</table>

Я не очень понимаю, почему я получаю такую ​​ошибку.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вы также можете использовать DateTime # iso8601 для преобразования даты в строку

https://ruby -doc.org / stdlib-2.3.3 / libdoc / date / rdoc / DateTime.html #метод-я-ISO8601

0 голосов
/ 20 января 2019

Для преобразования date (вместо datetime) вы можете использовать to_date или to_timestamp https://www.postgresql.org/docs/9.6/functions-formatting.html

...