2013-08-29 7 views
7

部分的な日付をリレーショナルデータベース(MySQL、PostgreSQLなど)に保存したい。たとえば、入力はちょうど年(2013)かもしれません。年と月(2013-08);または年、月、日(2013-08-29)。年が2013-01-01に拡張され、年、月、日を持つことと区別がつかないため、通常のDATE型を使用することはできません。データベースに部分日付を格納する

日付を3つの別々のフィールド(整数、年、月、日)に分割することを考えましたが、DBSのすべての日付の細分を失い、さらに多くの指標を管理する必要があります。

私の他の考えは、それを日付として保存し、日付がどれほど正確であるかを示す別の列を持つことです。たとえば、「2013-08-01」と「月」は、その日付が正確な月(2013-08)までであることを意味します。 「2013-08-01」と「日」は、2013-08-01の日付が完全に指定されていることを意味します。

これを行うにはどうすればよいですか?

+0

コードを入力してください。 –

+0

これはうんざりです。私はそのデータを表現するためのクリーンでシンプルな方法を考えることはできません。 – user2246674

+0

どのような種類のクエリを実行しますか? –

答えて

2

は、私が行くには2つの方法がそこにいると思う:

(1)ストアストリングのような日付の、:

'2013'    -- year 2013 
'2013-01'   -- year 2013, January 
'2013-01-01'   -- year 2013, January 1 

(2)ストア3異なる列、年、月、日(および年月+月+日付を作成できます)

2013 null null  -- year 2013 
2013  1 null  -- year 2013, January 
2013  1  1  -- year 2013, January 1st 

どちらが最適かは、どのようにデータをクエリするかによって異なります。プロシージャーを保管していて、パラメーターを渡してすべての行を条件に入れたいとします。

場合

(1)、あなたは、パラメータとして文字列@Date = '2013-01'渡し、あなたは= 2013年と月は= 01だからwhere句は次のようになり、すべての行を取得したい:

where left(Date, len(@Date)) = @Date 

をケース(2)では、次の3つのパラメータを渡す - @Year = 2013, @Month = 1, @Day = nullwhere句は次のようになり、何かのように:

where 
    Year = @Year and -- Supposing @Year is always not null 
    (@Month is null or @Month is not null and Month = @Month) and 
    (@Day is null or @Day is not null and Day = @Day) 

行をどのように処理したいかによって、より複雑になることがあります。たとえば、2013-01のようなパラメータを指定した場合、month = nullの行を取得したいのですか?

一方、日付を渡して日付範囲に入るかどうかを確認するには、Gordon Linoffの提案を使用することをお勧めします。

+0

+1このデータがどのように照会されるかを考慮する。 –

2

おそらく最も良い方法は、時間のスパンとして扱い、effdateenddateを持つことです。あなたはあなたが望む任意の時間範囲を表すことができます。 1年は「2012-01-01」と「2012-12-31」のようになります。 1つの日付は「2013-08-28」や「2013-08-28」のようになります。

これにより、四半期または他のグループの時間を処理するように表現を拡張する柔軟性も得られます。

+0

OPが範囲内の日付を確認したい場合は+1 +1 –

+0

"2013-01-01"を排他的に "2012-01-01"(包括的)として保存することがあります。 1日は「2013-08-28」(包括的)から「2013-08-29」(除外)になります。 'EndDate'を排他的にし、' StartDate'を含めれば、日付/時刻が範囲内にあるかどうかを簡単に判断できます。 –

+0

@WW。良い点 –

1

に「2013年8月」を意味し、実際の日付ではないため、date_truncを使用しないことを指定しました。だから、あなたはの瞬間を気にしないようです。、そしての期間はです。

文字列を保存するだけでいいと思います。あなたが保存する場合:

2013 
2013-08 
2013-09-25 

の文字列としてあなたは大丈夫です。彼らは大丈夫です。さらに、1つの列だけが必要です。 2つの列を使用すると、データが面白く見える可能性があります。 4がある理由はたとえば、あなたが

2013-09-04 | MONTH 

1を保存する場合は疑問に思うかもしれません。

また、あなたの提案に不正な形式の文字列が表示されることがあります。

もう一つのアイデアは、文字列を作ることです。ISO 8601 Time intervals。データベースシステムには、時間間隔の種類がある場合もあります。

+0

文字列を格納する際の問題は、たとえば、2013-08と2014-02の間の月数を簡単に算定することができないことです。そしてもう一度、あなたは他の選択肢の大部分でそれを行うことはできません。 –

関連する問題