2014-01-25 5 views
4

방법 중 하나에 해당하는 joda 날짜 시간 날짜가 모든 레코드를 필터링은 다음과 같이 될 것이다 : 더 간결한 방법으로 쿼리를 작성할 수있는 방법이슬릭 : 그것을 달성하기 위해 오늘

val now = DateTime.now 

val today = now.toLocalDate 
val tomorrow = today.plusDays(1) 

val startOfToday = today.toDateTimeAtStartOfDay(now.getZone) 
val startOfTomorrow = tomorrow.toDateTimeAtStartOfDay(now.getZone) 

val todayLogItems = logItems.filter(logItem => 
    logItem.MyDateTime >= startOfToday && logItem.MyDateTime < startOfTomorrow 
).list 

있습니까? 의 라인에 뭔가 : 자 NHibernate에 LINQ에 달성 그 때문에

logItems.filter(_.MyDateTime.toDate == DateTime.now.toDate).list 

내가이 부탁 해요 (Fetching records by date with only day part comparison using nhibernate).

+0

그나마 사용하는 것을 잊지를 === 대신 총을주고 들어이 도움이 포인터가 될 수있다 of == – RoyB

답변

4

Slick joda mapper가 비교를위한 지원을 추가하지 않는 이상 직접 추가하지 않는 한 운이 없다. * http://slick.typesafe.com/doc/2.0.0/userdefined.html * http://slick.typesafe.com/doc/2.0.0/api/#scala.slick.lifted.ExtensionMethods * https://github.com/slick/slick/blob/2.0.0/src/main/scala/scala/slick/lifted/ExtensionMethods.scala

나는 어떤 시점에서 슬릭에서 조사 할 수있는 티켓 생성 : https://github.com/slick/slick/issues/627

2

당신은 LocalDateTimes 작업 대신 직접 LocalDates를 사용하여 문제를 혼동하고 있습니다 :

val today = LocalDate.now 
val todayLogItems = logItems.filter(_.MyDateTime.toLocalDate isEqual today) 

UPDATE

주요 설명은 여기 질문에 필요하다, 슬릭 만에 언급 태그를 거쳐 전달합니다.

그러나 ... 슬릭은 filter 작업이 나는 도서관에 지나치게 익숙하지 않다 PlainColumnExtensionMethods

의 방법으로 SQL 쿼리에 실제로 있다는 사실에 경첩이 질문의 핵심입니다, 그러나 이것은해야 반드시 SQL로 실행될 수있는 작업에만 국한된다는 의미입니다. 이것은 Column [DateTime]이므로 다른 DateTime과 비교해야합니다.

LINQ 예제에서 모든 것을 먼저 가져온 다음 위의 예와 같이 진행하는 것이 좋습니다 (SQL이 아닌 스칼라에서 비교 수행). 이것은 옵션이지만 성능 비용이 필요하지 않을 것으로 생각됩니다.

업데이트 2 아무 대답이 없다

(단지 명확하게).

기본 데이터베이스가 날짜와 시간 소인간에 동등한 검사를 수행 할 수 있다는 보장이 없으므로 매끄러운 따라서 기존의 능력에 의존 할 수 없습니다.

당신은 바위와 어려운 곳 사이에 갇혀 있습니다. 이미있는 것처럼 타임 스탬프 사이의 범위 검사를 수행하거나 쿼리의 모든 것을 가져 와서 스칼라에서 필터링합니다 (성능 비용이 많이 든다).

  • SqlFunction를 통해,

    • 또한 기준에서 날짜 기능을 사용할 수 있습니다

      최종 업데이트

      당신이 참조하는 Linq에/NHibernate에 질문 참조하려면, 여기에 몇 가지 따옴표입니다 그것은 LINQ 공급자에 따라 달라집니다

    • NHibernate LINQ 공급자가 지원하는 경우 잘 모르겠습니다 ...(로컬 모든 기록과 필터링을 가져 오는에 의해)의 DB에 아마도 자동으로 타격 성능을 날짜 강제 논리를 밀어 NHibernate에 의지

      • 이있는 경우 :

      그래서 거기에 대한 대답이 될 것 같다 당신에 의존하지 수

    • 하면 최상의 시나리오는 NHibernate에 타임 스탬프 범위 확인에 날짜/타임 스탬프 비교를 번역 할 수 있습니다 사용자 정의 SQL 로직

    를 작성합니다. 이와 같은 것을하는 것은 Slick (그리고 매끄러운 joda-mapper)이 비교를 처리 할 수있는 방법에 대한 아주 깊은 질문입니다. 필터에서 사용한다는 사실은 우연입니다.

    복잡한 버그를 만들 위험이 있으므로 극도로 같은 유용한 기능을 직접 작성해야합니다. 당신은 더 나을 것 :

    • 분할 (어쩌면보기) 계산 된 열로 날짜를 추가하는 별도의 날짜/시간 열
    • 에 열
    • 사용자 정의 SQL (또는 저장된 프로 시저)를 사용하여 범위 고수 질의
    • 위한 헬퍼 경우의 도우미 함수

    를 사용

  • 을 확인 :

    def equalsDate(dt: LocalDate) = { 
        val start = dt.toDateTimeAtStartOfDay() 
        val end = dt.plusDays(1).toDateTimeAtStartOfDay() 
        (col: Column[DateTime]) => { 
        col >= start && col < end 
        } 
    } 
    
    val isToday = equalsDate(LocalDate.now) 
    val todayLogItems = logItems.filter(x => isToday(x.MyDateTime)) 
    
  • +0

    '_.MyDateTime'은'Column [Imports.DateTime]'타입이기 때문에'toLocalDate' 메쏘드가 없기 때문에 이것은 작동하지 않습니다. –

    +0

    'https : // github.com/tototoshi/slick-joda-mapper'에서'import com.github.tototoshi.slick.H2JodaSupport._'를 가져오고 있습니다. 그리고 그것은 나의 예제에서 사용 된 방식대로 작동합니다 . 그러나 MyDateTime의 멤버에 액세스하는 것은 작동하지 않습니다. –

    +0

    태그로 '매끄러운 (slick)'이라는 문구와 문제의 두 번째 예 (작동하지 않지만 메모리에서만 작동하는 경우 작동 함)를 사용하면 질문 문맥이 무엇인지 명확하게 알 수 있습니다. 미안하지만, 질문에 대답하지 않기 때문에'대답 '을 upvote 또는 accept 할 수 없습니다. –

    관련 문제