2012-05-30 2 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 작업에 최적화 된 알고리즘을 사용하지 않는 (이 완전히 데이터베이스와 테이블의 엔진에 따라 다름) 아마 것입니다.

하나의 솔루션은에서 볼 수 있듯이 DQL 지원하는 BETWEEN 연산자를 것 사용 (첫 번째에서 그것의 마지막 순간에) 하루 종일을 지정하는 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과 Oracle을 테스트 할 수있는 권한이 없으므로 왜 DQL에 구현되지 않았습니까? 이 사이의 물건은 이전의 LIKE 것보다 나에게 더 좋을 것 같습니다. 이전의 DATE() 아이디어보다 나을 것 같습니다. – GergelyPolonkai

+1

판단하기가 순진 할 지 모르지만 시간대 문제와 관련하여 많은 문제가 있습니다. SQL은 이것을 표준적인 방식으로 처리하지 못한다. 무시해도 큰 문제가 될 것이다 ... –

+0

국제 프로젝트에서 나는 경고 해 주셔서 감사하지만,이 경우에는 문제가되지 않을 것이다. – GergelyPolonkai