2010-06-07 13 views
40

w MySQL Jestem w stanie to zrobić:od teraz(), aby CURRENT_TIMESTAMP w PostgreSQL

SELECT * 
FROM table 
WHERE auth_user.lastactivity > NOW() - 100 

teraz w PostgreSQL używam tej kwerendy:

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

ale otrzymuję ten błąd:

operator does not exist: timestamp with time zone - integer 

Jak mogę rozwiązać?

Odpowiedz

85

Użyj odstępu zamiast liczby całkowitej:

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

Oto co docs MySQL powiedzieć o NOW():

Returns the current date and time as a value in 'YYYY-MM-DD HH:MM:SS' or YYYYMMDDHHMMSS.uuuuuu format, depending on whether the function is used in a string or numeric context. The value is expressed in the current time zone.

mysql> SELECT NOW(); 
     -> '2007-12-15 23:50:26' 
mysql> SELECT NOW() + 0; 
     -> 20071215235026.000000 

Teraz, z pewnością można zmniejszyć inteligentnej datę do czegoś mniej ...

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; 

jednak, że byłoby to bardzo zły pomysł, co trzeba zrozumieć, że czasy i daty nie są głupie numery unformated są ich own type z ich own set of functions i operators

Więc czas MySQL zasadniczo pozwala traktować NOW() jako typ głupi, lub przesłonięcie +, aby założyć, że nie mogę znaleźć w dokumentach MySQL. Tak czy inaczej, prawdopodobnie chcesz spojrzeć na typy date i interval na stronie.

24

Możesz również użyć now() w Postgres. Problem polega na tym, że nie można dodawać/odejmować liczb całkowitych od timestamp lub timestamptz. Można też zrobić jak sugeruje Mark Byers i odjąć przedział, lub użyć typu date który nie pozwala na dodawanie/odejmowanie liczb całkowitych

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

Nie downvoting, ale: INTERVAL sprawia, że ​​oczywiste, które jednostka pracujesz w podczas wykonywania datę matematyki. Na przykład nie jest oczywiste, które przyszłe chwile w czasie 'now() :: data + 100' reprezentuje. Czy jest przypadek, w którym matematyka całkowita jest konieczna w stosunku do matematyki INTERWAŁOWEJ? –

4

Oto przykład ...

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

added_time jest nazwa kolumny które konwertowane do char dla meczu

+0

To zadziała bardzo wolno, ponieważ oblicza operację w każdym wierszu. Więc nie może używać indeksu w zwykłej kolumnie "dodany_czas". Oczywiście możesz utworzyć indeks funkcjonalny na 'to_char (added_time, 'RRRR-MM-DD')', ale w tej sytuacji wydaje się, że jest on nad głową. – Hubbitus

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

Chociaż może to odpowiedzieć na pytanie, proszę również podać krótkie wyjaśnienie, co robi twój kod i dlaczego rozwiązuje początkowy problem. – user1438038

Powiązane problemy