부분적일 수 있는 날짜를 어떻게 저장합니까(예:단지 연도, 아마도 월도 가능) 나중에 동일한 사양으로 출력하시겠습니까?

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

문제

사용자가 일과 월을 포함하거나 포함하지 않을 수 있는 날짜를 지정할 수 있도록 하고 싶습니다(그러나 최소한 연도는 포함). 문제는 DB에 날짜/시간으로 저장될 때입니다.누락된 일/월은 기본값으로 저장되며 날짜의 원래 형식과 의미는 손실됩니다.

내 생각은 날짜/시간 열 외에 문자열로 열에 실제 형식을 저장하는 것이었습니다.그런 다음 다른 모든 항목에 대해 날짜와 날짜/시간을 표시해야 할 때마다 문자열 열을 사용할 수 있습니다.단점은 표시하려는 테이블의 모든 날짜 열에 대한 추가 열이며 날짜/시간 값에 의존할 수 없기 때문에 현지화된 날짜를 인쇄하는 것이 쉽지 않다는 것입니다.아마도 문자열을 구문 분석해야 할 것입니다.

나는 뭔가를 간과하고 더 쉬운 방법이 있기를 바라고 있습니다.

(솔루션이 중요한 경우 Rails를 사용하고 있습니다.)

도움이 되었습니까?

해결책

Jhenzie가 제안한대로, 날짜의 어느 부분이 지정되었는지 표시하는 비트마스크를 만듭니다.1 = 연도, 2 = 월, 4 = 일, 8 = 시간 (더 구체적으로 알고 싶다면) 그런 다음 이를 다른 필드에 저장합니다.

내가 생각할 수 있는 유일한 방법은 없이 테이블에 추가 열이 필요한 것은 jhenzie의 비트마스크 사용 방법을 사용한 다음 해당 비트마스크를 날짜/시간 열의 초 부분에 저장하는 것입니다.

다른 팁

모델에서는 관심 있는 부분에만 주의를 기울이세요.따라서 전체 날짜를 DB에 저장할 수 있지만 사용자에게 표시하기 전에 병합합니다.

추가 열은 지정된 날짜 시간 부분을 지정하는 데 간단하게 사용될 수 있습니다.

1 = 2 일 = 4 개월 = 연도

따라서 3은 일과 월, 6은 월과 연도, 7은 세 가지 모두를 의미합니다.그 시점에서는 간단한 int입니다.

문자열을 저장하는 경우 설명하는 경우 등을 다루는 ISO 8601 표준을 부분적으로 재발명하지 마세요.

http://en.wikipedia.org/wiki/ISO_8601

정말 날짜/시간으로 저장해야 합니까?문자열 2008, 2008-8 또는 2008-8-1로 저장하지 않은 경우 - 문자열을 꺼낼 때 하이픈으로 문자열을 분할하면 원래 입력이 얼마나 구체적인지 확인할 수 있습니다.

출력 방법을 결정하기 위해 날짜/시간과 추가 "정밀도" 열을 저장할 것입니다.출력의 경우 정밀도 열은 해당 형식 문자열("YYYY-mm" 등)이 포함된 열에 매핑되거나 형식 문자열 자체를 포함할 수 있습니다.

저는 DB 설계에 대해 잘 모르지만 사용자가 월과 일을 입력했는지 나타내는 부울 열(각각 하나의 열)을 사용하는 것이 깔끔한 방법이라고 생각합니다.그런 다음 주어진 날짜를 저장하려면 다음을 수행합니다.

  1. 사용자가 날짜/시간 열에 입력한 날짜를 저장합니다.
  2. 사용자가 월을 선택한 경우 부울 월 열을 설정합니다.
  3. 사용자가 날짜를 선택한 경우 부울 날짜 열을 설정합니다.

이렇게 하면 신뢰할 수 있는 날짜/시간 부분을 알 수 있습니다(예:사용자가 입력한 내용).

편집하다:또한, int 비밀스러운 값이 있는 필드!

informix 데이터베이스에는 이 기능이 있습니다.날짜 필드를 정의할 때 원하는 시간 및 날짜 속성의 마스크도 지정합니다.비교를 수행할 때는 이러한 필드만 계산됩니다.

다양한 수준의 특이성을 사용하는 가장 좋은 방법은 이를 간단한 nullable int로 저장하는 것입니다.년, 월, 일.프레젠테이션 모델의 표시 논리 또는 도메인의 값 개체를 캡슐화할 수 있습니다.

내장된 시간 유형은 순간을 나타냅니다.기본 제공 유형을 사용하고 정밀도(연도, 월, 일, 시간 등)에 대한 열을 생성하거나 고유한 날짜 구조를 생성하고 빈 부분에 null(또는 다른 유효하지 않은 값)을 사용할 수 있습니다.

적어도 루비의 경우 - 이 보석을 사용할 수 있습니다 - 부분 날짜https://github.com/58bits/partial-date

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