В mysql я могу сделать это:
SELECT *
FROM table
WHERE auth_user.lastactivity > NOW() - 100
теперь в postgresql я использую этот запрос:
SELECT *
FROM table
WHERE auth_user.lastactivity > CURRENT_TIMESTAMP - 100
но я получаю эту ошибку:
operator does not exist: timestamp with time zone - integer
Как я могу решить?
Используйте интервал вместо целого числа:
SELECT *
FROM table
WHERE auth_user.lastactivity > CURRENT_TIMESTAMP - INTERVAL '100 days'
Вы также можете использовать now ()
в Postgres. Проблема в том, что вы не можете складывать / вычитать целые числа из отметки времени
или отметки времени
. Вы можете либо сделать, как предлагает Марк Байерс, и вычесть интервал, либо использовать тип дата
, который позволяет вам складывать / вычитать целые числа
SELECT now()::date + 100 AS date1, current_date - 100 AS date2
Вот что говорится в документации MySQL о NOW ()
:
Возвращает текущую дату и время в виде значения в формате 'ГГГГ-ММ-ДД ЧЧ: ММ : SS 'или ГГГГММДДЧЧММСС.uuuuuu формат, в зависимости от того, является ли функция используется в строковом или числовом контексте. Значение выражается в текущем часовой пояс.
mysql> SELECT NOW();
-> '2007-12-15 23:50:26'
mysql> SELECT NOW() + 0;
-> 20071215235026.000000
Теперь вы, конечно, можете сократить свое умное свидание до чего-то меньшего ...
SELECT (
date_part('year', NOW())::text
|| date_part('month', NOW())::text
|| date_part('day', NOW())::text
|| date_part('hour', NOW())::text
|| date_part('minute', NOW())::text
|| date_part('second', NOW())::text
)::float8 + foo;
Но это было бы действительно плохой идеей, вам нужно понять, что время и дата - это не глупые неформатированные числа, это их собственный тип с их собственным набором функций и операторов
Таким образом, время MySQL по существу позволяет вам рассматривать NOW ()
как более тупой тип, или он переопределяет +
, чтобы сделать предположение, которое я не могу найти в документации MySQL. В любом случае, вы, вероятно, захотите посмотреть типы date
и interval
в pg.