2011-08-16 21 views
10

Estoy intentando realizar la siguiente consulta en Sqlalchemy.Hacer que Sqlalchemy use la fecha en filtro usando Postgresql

Select * from "Mytable" where Date(date_time_field) = "2011-08-16"; 

He intentado varios métodos. Algunos aquí en SO. Pero ninguno parece "realista", ya que algunos lo hacen Otros tipos de formación de cadenas?!?! y no es una simple Fecha simple() (Por fecha quiero decir la fecha Postgresql no la de Python) en el campo ORM.

¿Es posible en el nivel ORM declarar una Fecha simple() alrededor del campo consultado?

Saludos António

Respuesta

35

Usando @Ants Aasma Comentario.

Y mantenerlo limpio para cualquier búsqueda web.

from sqlalchemy import Date, cast 
from datetime import date 

my_data = session.query(MyObject).\ 
filter(cast(MyObject.date_time,Date) == date.today()).all() 

Gracias a todos los que trató de resolver este problema :)

+0

¡Perfecto! ¡Gracias! – user1914881

1

en PostgreSQL si date_time_field es un campo de la tabla a continuación, quer tienen como esto. Seleccione * de Mytable donde date_time_field = '2011-08-16'

+0

Hola, bueno más precisamente el campo es la marca de tiempo sin zona horaria :) – PythonWolf

+0

El fácil forma es simplemente lanzarlo a la fecha, seleccione * de mytable donde lanzar (date_time_field como date) = '2011-08-16'; La abreviatura para el casting en pgsql es el método :: like like: select * from mytable donde date_time_field :: date = '2011-08-16'; pero eso no es estándar de especificaciones SQL y no será portátil. Si no necesita portátil, entonces el método :: es mucho más limpio y más fácil de recordar también la sintaxis. Sin embargo, su método con la fecha (date_time_field) debería funcionar también. –

+0

Hola Scott, gracias ahora el problema es portar esto a Sqlalchemy, lo intentaré hoy :) – PythonWolf

6

funciones SQL nativas pueden ser invocados mediante el uso de func módulo

from sqlalchemy import func 
from datetime import date 

my_data = session.query(MyObject).filter(
    func.date(MyObject.date_time) == date.today() 
).all() 

Calling func.date

from sqlalchemy import select, func 
print select([func.date('2004-10-19 10:23:54')]) 

producirá siguiente SQL:

SELECT date(:date_2) AS date_1 

También puede declarar sus propios accesos directos a las funciones SQL:

from sqlalchemy.sql.functions import GenericFunction 
from sqlalchemy.types import DateTime 

class convert_tz(GenericFunction): 
    """ 
    Sqlalchemy shortcut to SQL convert timezone function 

    :param DateTime datetime 
    :param str from_tz: The timezone the datetime will be converted from 
    :param str to_tz: The timezone the datetime will be converted from 
    :returns: Datetime in another timezone 
    :rtype: DateTime or None if timezones are invalid 

    """ 
    type = DateTime 

utilizado como:

from sqlalchemy import select, func 
print select([func.convert_tz(func.now(), '+00:00', '-05:00')]) 

Se generará SQL siguiente:

SELECT convert_tz(now(), :param_1, :param_2) AS convert_tz_1 
+0

Esta publicación se marca automáticamente como de baja calidad porque es tan corta/solo código. ¿Le importaría expandirlo agregando texto para explicar cómo resuelve el problema? – gung

+0

Agregué explicaciones y referencias a la documentación. –

Cuestiones relacionadas