2017-02-22 2 views
0

私は年と呼ばれる列を持っています。私はそれが必ずしも順序でそれらを注文しない年でクエリを注文するとき、私はvarcharとして日付を格納し1つのセルに2年の日付を持つデータを格納するための形式は?

|year  | 
----------- 
|2015/2016| 
|2016/2017| 

は、しかし、私はこれは私がデータと使用されるフォーマットを保存する方法が原因だと思います。

今年はどのようなフォーマットを保存する必要がありますか?私はそれを "2015/2016"としておく必要があり、それらを分けることはできません。

+1

フィールドを正規化する必要があります。 –

+1

悪いデザインが好きです。なぜあなたはそれらを分割できないのですか?これを行う必要がある場合は、2つの列、開始年と終了年、両方の数値型を持たせます。それはあなたの人生を長期的にはるかに容易にします。 – Tanner

+0

varcharまたはnvarcharが唯一のオプションです。それをオフコースに分割する方が良いでしょう。しかし、正しい順序でないサンプルデータを提供できますか?各フィールドの長さが同じである場合、並べ替えは問題ではありません – GuidoG

答えて

3

短い回答:never 2つの値を1つの列に格納します。 長い答えはhttps://en.wikipedia.org/wiki/Database_normalization

タイプには、日付と時刻によく使用されるTIMESTAMPがあります。 VARCHARも受け入れられますが、この方法ではクエリでいくつかの特別な機能が欠けています。

UPD:これはプレゼンテーションレイヤーのUI(UI)のため、2015/2016 "としておく必要はありません。ユーザーはデータをどのように保存するか気にしません。

+1

これは答えだとは思わないが、コメントでなければならない – GuidoG

+0

@GuidoG実際これは完璧な答えです*あなたのデータを非正規化しないでください。 * NO *テキスト形式ではSARGableなどのデータが作成されます。つまり、フォーマットに関係なく効率的なクエリを使用することはできません。すべての行をスキャンしてデータを解析することなく、この間隔で日付を検索することはできません。 –

+0

私はより関連性の高いように投稿を更新しました。 –

0

これが私に与えられた生データだったと私は私がデータを正規化すると仮定の真ん中にあった:

私はボード上のコメントを取られ、varchar型が最善の策だろうことに同意し、として日付を分割しながらしています2列のように -

--- | yearStart | --- | yearEnd |
--- | 2015 | -------- | 2016 |
--- | 2016 || ------- | 2017 |
--- | 2017 | -------- | 2018 |

など

私は問題を解決する年の開始を使用してステートメントで注文することができます!

+0

に編集されます。おそらく、それらを 'smallint'として保存するべきです。 – SqlZim

+0

分割する場合は、varcharとして保存せずに数値として保存してください: 'int' – Tanner

関連する問題