2011-08-16 37 views
10

我試圖在Sqlalchemy中執行以下查詢。使Sqlalchemy在使用Postgresql的過濾器中使用日期

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

我試過了幾種方法。一些在這裏。 但似乎沒有「現實」,因爲有些人會拋出其他字符串格式化?!?!而不是簡單的日期()(按日期我的意思是Postgresql日期不是Python One)在ORM字段。

ORM級可能在查詢字段周圍聲明簡單日期()嗎?

問候 安東尼奧

回答

35

使用@Ants Aasma評論。

並保持它對任何網頁搜索的乾淨。

from sqlalchemy import Date, cast 
from datetime import date 

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

謝謝大家誰試圖解決這個問題:)

+0

完美!謝謝! – user1914881

1

在PostgreSQL如果date_time_field是你的表的一個字段,則必須QUER喜歡這樣。 選擇* from Mytable where date_time_field ='2011-08-16'

+0

你好,以及更多正是這個領域是時間戳沒有時區:) – PythonWolf

+0

簡單方法是隻投射它到目前爲止,選擇* from mytable where cast(date_time_field as date)='2011-08-16';在pgsql中鑄造速記是::方法就像這樣:select * from mytable where date_time_field :: date ='2011-08-16';但這不是SQL規範標準,並且不可移植。如果你不需要便攜式,那麼::方法更清晰,並且更容易記住語法。然而,你的方法與日期(date_time_field)也應該工作。 –

+0

你好斯科特,謝謝現在的問題實際上是將其移植到Sqlalchemy,我今天會試試:) – PythonWolf

6

本地SQL函數可以使用使用func模塊

from sqlalchemy import func 
from datetime import date 

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

調用func.date

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

會產生被調用以下SQL:

SELECT date(:date_2) AS date_1 

您也可以聲明自己的快捷方式到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 

使用,如:

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

它會生成以下SQL:

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

這篇文章被自動標記爲低質量,因爲它是如此短/唯一的代碼。你介意加入一些文字來解釋它是如何解決問題的嗎? – gung

+0

我添加了對文檔的解釋和參考。 –