2014-11-28 2 views
0

날짜를 일반 텍스트 문자열과 실제 날짜로 저장하는 레거시 데이터베이스가 있습니다. 관련성이 높고 중요한 날짜는 문자열로 저장됩니다.문자열로 저장된 날짜를 사용하여 날짜별로 검색하는 방법은 무엇입니까?

문자열에 대해 GORM을 사용하는 것은 매우 간단합니다.

어려움은 내가 날짜별로 검색해야하며 그 날짜는 "2014 년 11 월 28 일"과 "2014 년 11 월 28 일 12:00:00 AM"의 두 가지 형식으로 문자열로 저장된다는 것입니다.

+0

1) 데이터베이스 열을 수정할 수 있습니까 (아니면 최소값으로 정규화 할 수 있습니까)? 2) 계산 열을 추가 할 수 있습니까? 3) [계산 된/구체화 된] 뷰를 추가 할 수 있습니까? 4) 검색 작업의 유형 *이 필요합니다 - 날짜의 _ 특정 _ 날짜 또는 _ 범위 _ 5) 검색에 허용되는 최악의 성능 한계/복잡성은 얼마입니까 (예 : 몇 개의 행이 있고 어떤 다중성이 관련되어 있습니까?). – user2864740

+0

은 SQL을 사용하는이 데이터베이스입니까? – Rafael

+0

1) 수정할 수 없습니다. 2) 계산 된 열이 아마도 가장 빠른 접근 방식 일 것입니다. 3) 내가 바라는 견해입니다. 4) 날짜의 범위와 특정 날짜. 4) 최근 annoucned 데이터 제한 이전에 우리는 수백만 행 범위였습니다. –

답변

0

데이터베이스와 관련된 솔루션이 없으면이 작업을 수행 할 수 없으며 해당 솔루션은 사용중인 데이터베이스에 따라 다릅니다. 이 작업을 수행하려면 데이터베이스가 요구 사항을 충족 시키도록 설계되지 않았다는 증거입니다. 테이블의 모든 단일 레코드를 방문하고 문자열 변환을 수행하여 변환 결과를 기준으로 필터링 할 수 있다면 규모가 조정되지 않습니다. 데이터베이스가 작고 성능에 문제가 없다면 데이터베이스에 따라 수행이 가능할 수도 있지만 이에 대한 좋은 해결책은 아닙니다.

+0

나는 Jeff와 내가 이전에이 사실을 내 회사에 발표 한 모든 것에 동의하지만 그들은 변화에 반대하거나 변할 수 없다. 데이터베이스는 나에 의해 설계된 것이 아니며 모든 종류의 상태 또는 객체를 정규화하거나 표현한 것인데, 즉 5 개의 열은 column1, column2 등과 유사하게 명명되며 논리는 데이터베이스를 사용하여 언제 사용할 것인지를 결정합니다. 비교에 의해이 데이터베이스는 "작음"이며 이렇게하면 데이터 세트가 훨씬 더 제한됩니다. 도움이된다면 데이터베이스는 Oracle 11g입니다. –

+1

오라클 특정 물건에 대해 잘 알고 있다면 원하는 것을 수행하고 계속 진행하는 저장 프로 시저를 작성하십시오. GORM은 그것에 관여 할 필요가 없습니다. –

0

당신은 또한이 같은 SQL 뭔가에서, 또는 문 내에서 두 형식을 모두 .withCriteria {...}를 검색하고 spesify 수 :

WHERE (date = '2014/01/01' OR date = '2014/01/01 12:00:00 AM') 
AND something_else = "other-thing" 

을 근본적인 문제는 여전히 이전 응답 거기에 명시된 것과 같다 그러나.

+0

감사합니다 boubbin하지만 어떻게 비교 미만 또는 큰 허용 할 것입니다. –

0

모든 데이터를 동일한 데이터 유형으로 가져와야합니다. 그런 식으로 비교하고 조작하기가 더 쉽습니다. 문자열 값을 날짜 값으로 변환하지 않으시겠습니까? 프로젝트 디렉토리에 grails console를 열고 시도 이 :이 출력 받아야

String myDate1 = "11/28/2014" 
def newDate1 = new Date().parse("M/d/yyyy", myDate1) 
println "newDate1 = ${newDate1}" 
println "newDate1 plus one day = ${newDate1 + 1}" 

String myDate2 = "11/28/2014 12:00:00 AM" 
def newDate2 = new Date().parse("M/d/yyyy H:m:s a", myDate2) 
println "newDate2 = ${newDate2}" 
println "newDate2 plus one day = ${newDate1 + 1}" 

:

newDate1 = Fri Nov 28 00:00:00 PST 2014 
newDate1 plus one day = Sat Nov 29 00:00:00 PST 2014 
newDate2 = Fri Nov 28 12:00:00 PST 2014 
newDate2 plus one day = Sat Nov 29 00:00:00 PST 2014 

을 그리고 당신이 말한대로 필터링해야합니다 있도록이 매우 큰 데이터베이스가 아닙니다 당신의 로드 된 배열을 검색합니다. 그러나 일단 날짜로 값을 가지면 "더 큰 것"과 "적은 것"의 값을 비교할 수 있습니다.

관련 문제