생년월일의 반환 목록에 대한 데이터베이스 Agnostic SQL 타임 스탬프로 저장된 날짜

StackOverflow https://stackoverflow.com/questions/868464

문제

출생 날짜에 시간과 시간없이 저장된 날짜에 검색해야하지만 검색해야 할 날짜는 시간과 분만 포함 날짜가 일, 월 및 연도에만 일치하는 모든 행을 반환하는 가장 좋은 방법은 무엇입니까?


01-Jan-50 10.22.06.000000000으로 저장됩니다
선택된 날짜 01-Jan-50 10.22.06.010101120

시간과 분으로 날짜를 사용하는 경우 SQL은 정확한 타임 스탬프로 만 행을 반환합니다.

SQL은 Oracle, SQLServer, MySQL 및 DB2에서 작업해야합니다.

도움이 되었습니까?

해결책

Oracle의 날짜 유형은 SQL 표준 버전 (Informix와 마찬가지로)을 사전 데이트하므로 DBMS 중립 방식으로하는 것이 불가능하지는 않지만 매우 어렵습니다. 물론 "선택된 데이터 표현에는 시간이 포함되는 이유"라는 질문이 있습니다.

표준 SQL에서, 명백한 기술은 타임 스탬프를 날짜로 캐스팅하는 것입니다. 또한 검색 해야하는 데이터에 대한 명확한 설명도 없습니다.

SELECT CAST(DateOfBirth AS DATE), ...other columns...
    FROM TheMysteryTable         -- Why do people hate giving tables names?
    WHERE CAST(DateOfBirth AS DATE) =
          CAST(TIMESTAMP '1950-01-01 10.22.06.010101120' AS DATE)

그러나 그것은 당신이 '검색 날짜'를 문자 그대로 작성한다고 가정합니다. 호스트 변수 인 경우 호스트 변수의 유형은 타임 스탬프가 아닌 날짜 여야합니다. 그리고 날짜의 날짜 열은 아마도 타임 스탬프가 아닌 날짜 일 것입니다. 시간 부분이 관련이없는 한 타임 스탬프를 사용해서는 안됩니다. 저장을 낭비하고 계산 시간을 낭비합니다.

캐스트 때문에 DBMS가 인덱스 나 다른 것을 사용할 수있을 것 같지 않습니다. 유형이 제정신 인 경우 쿼리는 간단합니다.

SELECT DateOfBirth, ...other columns...
    FROM TheMysteryTable
    WHERE DateOfBirth = DATE '1950-01-01'

다른 팁

모든 솔루션에는 날짜 및 DateTime 객체의 조작이 필요하므로 시스템 비전자 솔루션이 없을 것입니다. 각각은 해당 객체에 대해 다른 기능을 갖습니다.

데이터베이스 추상화 이외의 최상의 솔루션은 먼저 사용되는 DateTime 객체를 마무리하는 것입니다. 그런 다음 모든 나열된 DBS에서 작동하는 일반 SQL 비교 절만 필요합니다.

ANSI 날짜 형식이나 문자열 조작이 없습니다. 모든 코드는 특정 RDBMS에서만 실행됩니다.

그러나 RDBMS (예 : PHP, Java 등) 밖에서 선택한 날짜를 얻는 경우 쿼리로 보내기 전에 소독 할 것을 제안합니다. 그런 다음 문자열을 문자열과 비교할 수 있으며, 이는 거의 모든 시스템에서 작동해야합니다.

다른 사람들이 지적했듯이, RDBMS는 DateTimes를 처리 할 때 매우 다양합니다. 만약에 그들은 실제로 ANSI-92 표준을 따랐으며 다음은 작동해야합니다.

SELECT
     <column list>
FROM
     <table name>
WHERE
     CAST(birth_date AS DATE) = CAST(search_date AS DATE)

대부분의 시스템의 날짜에 인덱스를 사용하지 않기 때문에 가장 효율적인 방법은 아닙니다. 다음과 같은 ~할 것 같다 완전히 ANSI-92 호환 데이터베이스 작업 :

SELECT
     <column list>
FROM
     <table name>
WHERE
     birth_date >= CAST(CAST(search_date AS DATE) AS DATETIME) AND
     birth_date < CAST(CAST(search_date AS DATE) + 1 AS DATETIME)

Extract () 사용

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top