2016-06-21 1 views
2

이 게시물에 대한 SQL 바이올린을 만들었습니다 http://sqlfiddle.com/#!15/7b5d7/1/0왜 daterange에 대한 postgres의 상위 범위 함수가 배타적 범위를 반환합니까?

질문 # 1

왜 배타적 경계가 실제로 포함 하한과 함께 범위를 저장할 수있는 daterange와 기록을 삽입하지 독점 상한? pg가 둘 모두를 포괄적 인 범위로 저장하지 않는 이유는 무엇입니까?

질문 # 2

SELECT upper('[2016-06-19, 2016-06-21)'::daterange) 반환 2016-06-21. [은 포괄적 인 하한을 의미하고 )은 상한 상한을 의미합니다.

상한 금액을 선택하지 않아야합니다. 2016-06-20? 날짜에 별개의 간격이 있습니까?

+3

이것이 구현 방법입니다. [매뉴얼에서] (https://www.postgresql.org/docs/current/static/rangetypes.html # RANGETYPES-DISCRETE) : "내장 범위 형식 int4range, int8range 및 daterange는 모두 하한을 포함하고 상한을 제외하는 정규 형식을 사용합니다 (즉,'[)'* 'And'[2016 -06-19, 2016-06-21)은'[2016-06-19, 2016-06-20]' –

+0

과 정확히 같은 범위입니다. 질문 2 번에 대해서는 수동으로 datananges가 분리되어 있습니다. 2016-06-21 대신'2016-06-20'을 반환해야하지 않을까요? –

답변

4

Re 질문 1 : 학술 문헌에 20-25 년의 역사가있는 날짜 범위를 처리하기위한 표준 방법은 폐쇄 방식입니다. 242-25 페이지의 Bitemporal 데이터 및 Tom Johnston 저, SQL에서 시간 중심 데이터베이스 응용 프로그램 개발 Richard Snodgrass 저.

하지만 이유 중 하나는 연속 범위가 겹치지 않는다고 생각합니다. a[May2016, Jun2016)이고 b[Jun2016, Jul2016) 인 경우, 그들은 일을 공유하지 않습니다. 그래서 그들은 "함께 스냅"하고, 그들이 만지는 가장자리의 경우에 대해 걱정할 필요가 없습니다.

닫힌 상태의 한 가지 단점은 빈 범위를 지정할 수 없다는 것입니다. [May2016, May2016)은 단순히 자기 모순이며, [May2016, May2016]은 즉각적인 것입니다.

다시 질문 # 2 : 다시는 달라졌을 수도 있지만, 내가 upper([May2016, Jun2016)) 반환 Jun2016을 만드는 몇 가지 장점을 생각할 수 있습니다

  • 이 범위의 해상도에 관계없이 같은 일을 반환합니다.
  • 열린 끝점의 수학적 의미와 비슷합니다. 가능한 답변입니다.
  • "label"과 일치하는 것을 반환하므로 틀림없이 덜 놀랍습니다.
  • 두 개의 범위가 "충족"되는지 쉽게 확인할 수 있습니다 : upper(a) = lower(b).

또한 Postgres 에서 모두 시간 관련 데이터 유형은 이산되어 있습니다. 이전에는 플로트 기반 타임 스탬프를 사용하여 Postgres를 컴파일하는 옵션이 있었지만 사용되지 않으며 결코 발생하지 않았습니다.

+0

이 우수한 답변에 감사드립니다. 나는 확실히 당신이 열거 한 자원을보고/읽을 것입니다. –

+0

나는 이것을 위해 책 하나를 사지 않겠지 만, 임시 데이터베이스의 주제는 상당히 깊고 매혹적이다. Snodgrass 책은 http://www.cs.arizona.edu/~rts/publications.html에서 무료로 볼 수 있습니다 (그러나 인쇄물을 읽기에는 더 좋을 것입니다). –

+0

오 : 존스턴 (Johnston)은 각주에서 자신의 다른 저서 [Relational Databases에서의 시간 관리 *], 56-59 페이지에서 클로저/오픈에 대한 이론적 근거를 다루고 있다고 말합니다. 나는 그것을 읽지 않았다. –

관련 문제