2010-06-07 14 views
40

en MySQL soy capaz de hacer esto:Desde ahora() para CURRENT_TIMESTAMP en PostgreSQL

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

ahora en PostgreSQL estoy usando esta consulta:

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

pero me sale este error:

operator does not exist: timestamp with time zone - integer 

¿Cómo puedo resolverlo?

Respuesta

85

Utilice un intervalo en lugar de un entero:

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

Esto es lo que la documentación de MySQL dicen sobre 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 

Ahora, que sin duda puede reducir su fecha inteligente para algo menos ...

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; 

embargo, que sería una muy mala idea, lo que hay que entender es que los tiempos y las fechas no son números unformated estúpidos, son su own type con su own set of functions y operators

Así que el tiempo de MySQL esencialmente le permite tratar NOW() como un tipo más tonto, o anula + para hacer una presunción que no puedo encontrar en los documentos de MySQL. En cualquier caso, es probable que desee ver los tipos date y interval en la pág.

24

También puede usar now() en Postgres. El problema es que no puede sumar/restar enteros de timestamp o timestamptz. Puede hacerlo como sugiere Marcos Byers y restar un intervalo, o utiliza el tipo de date que no le permiten añadir/restar números enteros

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

No violé, pero: INTERVAL hace que sea obvio en qué unidad está trabajando cuando realiza la fecha matemática. Por ejemplo, no es obvio qué instantáneo futuro en el tiempo 'now() :: date + 100' representa. ¿Hay algún caso en que las matemáticas enteras sean necesarias sobre las matemáticas INTERVAL? –

4

Aquí está un ejemplo ...

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

added_time es un nombre de columna que convertí a char para la coincidencia

+0

Eso funcionará muy lento porque calcula el funcionamiento en cada fila. Por lo tanto, no puede usar el índice en la columna simple 'added_time'. Por supuesto, puede crear un índice funcional dicho en 'to_char (added_time, 'YYYY-MM-DD')', pero parece estar sobrecargado en esa situación. – Hubbitus

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

Si bien esto podría responder a la pregunta, proporcione también una breve explicación de lo que hace su código y por qué soluciona el problema inicial. – user1438038

Cuestiones relacionadas