Как я могу использовать функцию отметки времени PSQL в качестве параметра в Ruby? - PullRequest
0 голосов
/ 22 октября 2019

Я использую метод Ruby для доступа к информации о задаче из базы данных Postgres.

def query(statement, *params)
    @logger.info("#{statement}: #{params}")
    @db.exec_params(statement, params)
end

def tasks_completed_for_date(date="CURRENT_DATE")   
    sql = <<~SQL
      SELECT tasks.name AS task_name,
             timetable.start_at AS start_at,
             timetable.end_at AS end_at,
             timetable.duration AS duration,
             timetable.start_at::date AS task_date
        FROM tasks
        JOIN timetable ON tasks.id = timetable.task_id
        WHERE timetable.start_at::date = $1
          AND timetable.duration IS NOT NULL
        ORDER BY tasks.name ASC;
    SQL

    result = query(sql, date)

    if result.ntuples > 0
      result.map do |tuple|
        {
          task_name: tuple['task_name'],
          start_at: tuple['start_at'].slice(11, 5),
          end_at: tuple['end_at'].slice(11, 5),
          total_time: tuple['duration'].slice(0, 5),
          task_date: tuple['task_date'].slice(5, 5)
        }
      end
    end
  end

Я хочу, чтобы значением по умолчанию для запроса была текущая дата. Я подумал, что лучший способ сделать это - установить параметр по умолчанию в методе с именем tasks_completed_for_date на строку CURRENT_DATE. Эта строка будет интерпретироваться PSQL как метод CURRENT_DATE и возвращать данные на основе этой даты. Вместо этого я получаю следующую ошибку:

ОШИБКА: значение даты / времени «current» больше не поддерживается

Я вообще не использую «current», и я знаю, что что бы это ни было, этоустарели. Есть ли способ передать метод PSQL в запрос (вместо $ 1), как я пытаюсь здесь, что не приводит к ошибке?

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Ваша проблема в том, что значением заполнителя $1 будет строка 'CURRENT_DATE', а не буквальное значение CURRENT_DATE. В результате вы фактически говорите 'CURRENT_DATE'::date, и это не работает:

psql> select 'current_date'::date;
ERROR:  date/time value "current" is no longer supported
LINE 1: select 'current_date'::date;
               ^

Вам нужно либо вставить буквенное значение current_date в запрос, либо найти строку, которая правильно приводит ксвидание. Проще всего было бы использовать 'now', поскольку это приводит к хорошему приведению:

psql> select 'now'::date;
    date    
------------
 2019-10-22
(1 row)

Быстрое изменение значения по умолчанию для аргумента даты метода должно быть достаточно хорошим:

def tasks_completed_for_date(date = 'now')
0 голосов
/ 22 октября 2019

Вы можете заменить $1 одним из следующих методов:

DATE 'today'
DATE 'now'

Также вы можете использовать:

TIMESTAMP 'today'

Так, например, вызвать метод как tasks_completed_for_date('today')

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