部分的な日付(つまり、年だけ、場合によっては月も)、後で同じ仕様で出力しますか?

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

質問

ユーザーが日と月を含む場合と含まない場合がある日付を指定できるようにしたいと考えています (ただし、少なくとも年は含まれます)。問題は、日付が DB に日時として保存される場合です。欠落している日/月はデフォルト値として保存され、日付の元の形式と意味が失われます。

私のアイデアは、日時列に加えて実際の形式を文字列として列に保存することでした。そうすれば、他のすべての日付と日時を表示する必要があるときはいつでも、文字列列を使用できます。欠点は、表示したいテーブル内の日付列ごとに追加の列が存在することです。日時値に依存できないため、ローカライズされた日付を印刷するのはそれほど簡単ではありません...おそらく文字列を解析する必要があるでしょう。

何かを見落としているので、もっと簡単な方法があるかもしれないことを願っています。

(解決策として重要な場合は、Rails を使用していることに注意してください。)

役に立ちましたか?

解決

ジェンジーが提案したように, 、日付のどの部分が指定されているかを示すビットマスクを作成します。1 = 年、2 = 月、4 = 日、8 = 時 (より具体的にすることにした場合) そしてそれを別のフィールドに保存します。

私がそれを行うことを思いついた唯一の方法 それなし テーブルに追加の列が必要な場合は、ビットマスクを使用する jhenzie の方法を使用し、そのビットマスクを日時列の秒の部分に格納します。

他のヒント

モデルでは、関心のある部分のみに注目してください。したがって、日付全体をデータベースに保存できますが、ユーザーに表示する前に日付を結合します。

追加の列は、日付時刻のどの部分が指定されているかを指定するために簡単に使用できます。

1 = 2日目=月4 =年

つまり、3 は日と月、6 は月と年、7 は 3 つすべてです。その時点では単純な int です

文字列を保存する場合は、説明したケースなどをカバーする ISO 8601 標準を部分的に再発明しないでください。

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

本当に日付時刻として保存する必要があるのでしょうか?文字列 2008 または 2008-8 または 2008-8-1 として保存されていない場合は、文字列を取り出すときにハイフンで分割すると、元の入力がどの程度具体的であるかを確認できます。

おそらく、日時と追加の「精度」列を保存して、出力方法を決定するでしょう。出力の場合、精度列は、対応する書式設定文字列 (「YYYY-mm」など) を含む列にマップすることも、書式設定文字列自体を含めることもできます。

DB 設計についてはあまり詳しくありませんが、きれいに実行する方法は、ユーザーが月と日を入力したかどうかを示すブール列 (それぞれ 1 列) を使用することだと思います。次に、指定された日付を保存するには、次のようにします。

  1. ユーザーが入力した日付を日時列に保存します。
  2. ユーザーが月を選択した場合は、ブール値の月列を設定します。
  3. ユーザーが日付を選択した場合は、ブール値の日付列を設定します。

こうすることで、日時のどの部分が信頼できるかを知ることができます(つまり、ユーザーが入力した内容)。

編集:また、 int 不可解な値を含むフィールドです!

Informix データベースにはこの機能があります。日付フィールドを定義するときは、必要な時刻と日付の属性のマスクも指定します。比較を行う場合、これらのフィールドのみが考慮されます。

さまざまなレベルの特異性があるため、単純な null 許容 int として格納するのが最善の策です。年月日。表示ロジックをプレゼンテーション モデルまたはドメインの値オブジェクトにカプセル化できます。

組み込みの時間タイプは、瞬間を表します。組み込み型を使用して精度を高めるための列 (年、月、日、時など) を作成することも、独自の日付構造を作成して空の部分に null (または別の無効な値) を使用することもできます。

少なくとも Ruby の場合は、この gem を使用できます - 部分日付https://github.com/58bits/partial-date

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top