2013-06-16 2 views
3

그래서 테이블이 있습니다.포스트그레스 및 부분 날짜

  • 지원 부분 날짜 : 해당 테이블의 모든 항목에 가지고 그와 관련된 날짜가 5 월 2 일 1994 년 16:45 그리니치 표준시 + 42003년 4월는 모두 유효
  • 될 수 있습니다 comparable : 특정 날짜 전후의 모든 항목을 쿼리하려고합니다.이 날짜는 항상 완료됩니다 (즉, 초 단위 및 시간대까지 정확함). 년 4 월 20035 월 2 일 1994 16:45 GMT + 4 후 올해야하고, 날짜는 정밀도로 주문해야합니다 (즉, 2003 *이 4 월 3 2003 앞에 오는 년 4 월).

이 문제를 어떻게 해결할 수 있습니까? 저는 현재 Postgres와 협력하고 있지만 (묶이지는 않았습니다) 모든 날짜 속성에 대해 간단하게 int 컬럼이있는 접근 방식을 사용하고 있습니다. 실제 정렬/비교 로직을 어플리케이션으로 이동시킵니다.

흥미로운 아이디어가 있습니까?

답변

5

ISO 8601 날짜 문자열을 사용할 수 있습니다. ISO 날짜 형식은 사용자가 설명하는 양식의 부분 날짜를 지원합니다 (예 : "4 월 23 일"은 1 년이 아님). 1994-05-02T12:45:00Z

  • "2003년 4월":

    • "제 2 회 1994 수 16:45 GMT + 4"

      귀하의 예는 것 2003-04

    당신은 정렬이를 비교할 수 있습니다 간단한 문자열로하고 원하는 결과를 얻을 수 있습니다. 나는. 은 어휘적으로 2003-04 뒤에옵니다.

    끝에서 모든 정밀도를 제거 할 수 있으며 여전히 작동합니다. 처음이나 중간에서 구성 요소를 제거 할 수 없습니다.

    위 예제와 같이 올바르게 작동하려면 모든 표준 시간대를 UTC로 표준화해야합니다.

    데이터베이스에서 날짜/시간 소인 형식을 사용하려면 보조 정밀도에 날짜의 정밀도를 저장하는 것이 좋습니다. 예 : 날짜 필드에 "2003 년 4 월"을 시간 소인으로 저장하고 2 차 필드에 플래그를 사용하여이 날짜가 "월"정밀도로 저장되고 "2003 년 4 월 1 일 오전 12시"로 해석되어서는 안됨을 나타냅니다.

  • +0

    깔끔함! ISO 8601을 분류 할 수 없다고 생각한 것을 완전히 기각했습니다. 고마워. – maligree

    1

    PG 데이터베이스에서 날짜 또는 시간 소인 (아마도 시간대 포함)을 저장하고 필요에 따라 날짜 연산에 의존합니다.

    앱 수준에서는 2003 년 4 월과 같은 가비지를 데이터베이스가 저장하기 위해 허용하는 정상적인 형식으로 전환합니다. PHP를 사용하는 경우 strtotime이 많은 도움이됩니다.

    +3

    이런 식으로 날짜/타임 스탬프 유형을 사용하는 데 따른 문제점은 데이터를 다시 읽을 때 예를 들어 다음과 같이 구분할 수 없다는 것입니다. '2003 년 4 월'과'2003 년 4 월 1 일 오전 12시'. 그러나 2 차 "정밀도"열과 함께 날짜/시간 소인을 사용할 수 있습니다. – simonp