Від тепер () до Current_timestamp у Postgresql


77

У 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

Як я можу вирішити проблему?

Відповіді:


132

Використовуйте інтервал замість цілого числа:

SELECT *
FROM table
WHERE auth_user.lastactivity > CURRENT_TIMESTAMP - INTERVAL '100 days'

34

Ви також можете використовувати now()в Postgres. Проблема в тому, що ви не можете додавати / віднімати цілі числа з timestampабо timestamptz. Ви можете або зробити так, як пропонує Марк Байерс, і відняти інтервал, або використовувати dateтип, який дозволяє додавати / віднімати цілі числа

SELECT now()::date + 100 AS date1, current_date - 100 AS date2

4
Не проти, але: INTERVAL робить очевидним, в якому підрозділі ви працюєте, коли ви проводите математичну оцінку. Наприклад, неочевидно, який майбутній момент часу now()::date + 100представляє. Чи є випадок, коли цілочисельна математика необхідна над ІНТЕРВАЛЬНОЮ математикою?
Chris Betti

6

Ось приклад ...

select * from tablename where to_char(added_time, 'YYYY-MM-DD')  = to_char( now(), 'YYYY-MM-DD' )

added_time - це назва стовпця, яку я перетворив на char для збігу


Це працюватиме дуже повільно, оскільки обчислює операцію на кожному рядку. Отже, він не може використовувати індекс для простого added_timeстовпця. Звичайно, ви можете створити функціональний індекс, про який говорили далі, to_char(added_time, 'YYYY-MM-DD')але в цій ситуації це здається накладним.
Hubbitus

6

Ось про що говорять документи MySQL NOW():

Повертає поточну дату та час як значення у форматі YYYY-MM-DD HH:MM:SSабо YYYYMMDDHHMMSS.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.


-2
select * from table where column_date > now()- INTERVAL '6 hours';

3
Незважаючи на те, що це може відповісти на запитання, надайте також коротке пояснення, що робить ваш код і чому він вирішує початкову проблему.
user1438038
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.