2012-05-30 91 views
0

我有一個稱爲Szerzodes的學說實體,其日期時間字段爲exportalva。是否有可能以某種方式獲得exportalva字段的日期部分是給定值的記錄?例如,我想要獲取某一天導出的記錄,無論時間如何。我試圖Doctrine 2 - 按日期時間字段的日期部分篩選結果

$em->createQuery("SELECT sz FROM Szerzodes sz WHERE DATE(sz.exportalva) = '2012-05-17'") 

但它失敗,因爲DATE()不是DQL的已知函數。現在我暫時使用

$em->createQuery("SELECT sz FROM Szerzodes sz WHERE sz.exportalva LIKE '2012-05-17%'") 

但它似乎是一個醜陋的黑客對我來說。有一個更好的方法嗎?

回答

4

考慮到你在你的數據庫有一個DATETIME領域,它可能是在使用LIKE(這完全取決於數據庫和表的引擎),你都沒有使用進行了優化,DATE操作的算法。

一種解決方案是使用BETWEEN操作由DQL在它看到支持對指定整天(從第一個到它的最後一秒)EBNF:

$em->createQuery("SELECT sz FROM Szerzodes sz WHERE sz.exportalva BETWEEN '2012-05-17 00:00:00' AND '2012-05-17 23:59:59'") 

如果你真的想要爲此使用函數,最好在值中使用函數,而不是在條件中使用的列。某些數據庫(如MySQL)不使用本地函數修改的列中的索引。您可以使用DQL User defined function創建一個名爲DATE的用戶函數,該函數執行您期望的操作(它可以很容易地完成前面提到的上述示例)。

+0

在MySQL,PostgreSQL和SQLite3中有一個DATE()函數,我沒有MSSQL,也沒有甲骨文來測試它,想知道爲什麼它沒有在DQL中實現。這之間的東西似乎對我來說比以前的老東西更好,也許比我以前的DATE()想法更好。 – GergelyPolonkai

+1

對我而言,判斷可能太天真了,但在時區問題上存在很多問題。 SQL沒有以標準的方式處理這個問題,忽略它將是一個巨大的問題... –

+0

雖然在一個國際項目中,我會感謝你警告我,在這種情況下,這不會是一個問題。 – GergelyPolonkai