2009-03-30 15 views
31

データベースに年を挿入する必要があります(例:1988,1990など)。 DateまたはDatetime データ型を使用すると、エラーが表示されます。どのデータ型を使用すべきですか?SQLデータ型 - 年を格納する方法?

答えて

24

年をデータベースに格納する必要がある場合は、Integerデータ型を使用するか年を格納する)またはDateTimeデータ型(これは、基本的にフォーマットの1/1/1990 00:00:00である日付の格納を伴います)。

+7

**怠惰で、 "ちょうどintを使用"しないでください。**あなたのデータ型を適切にサイズ設定すると、2バイトの整数が良い選択です。4桁の年を4バイトに格納することで、ディスク容量だけでなく、より多くのリソースを浪費しています。あなたのシステムは、この列に対して2倍のキャッシュメモリを使用し、2倍のIOデータをプッシュするなど、永遠に負荷をかけられます。 http://dba.stackexchange.com/q/4968 –

0

ちょうど1年、何もありませんか? 単純な整数を使用してみませんか?

+0

Ohh god ,,常識で – peter

+4

ちょっと!なぜ簡単なことをしようとしているのですか?私たちはSOの質問を使い果たします! –

1

保存する必要があるものがすべて年の場合は、整数を使用します。この列を照会する際に日付に基づく計算があると思われる場合は、datetimeを使用することもできます。

+0

ありがとう,, thats私の間違い – peter

25

通常の4バイトINTは大きくてスペースが無駄です!

どのデータベースを使用しているのかわからないので、特定のデータ型を推奨できません。誰もが "整数を使う"と言っていますが、ほとんどのデータベースは整数を4バイトで格納しています。これはあなたが必要とする以上のものです。 2バイトの整数(SQL Serverではsmallint)を使用する必要があり、スペースを節約します。

+1

多くの場合、整数を使用してスペースを無駄にすることは、より小さなデータ型を使用するよりも、現代のプロセッサーが処理効率が高いため(32ビット)より小さいデータ型よりも短くなります。 – Ender

+0

@Ender、あなたは実際にこれらの値で数学をやっているわけではありません。ストアとルックアップのプロセスです。小さい場合はRAMに多くの値を格納することができ、小さい場合はディスクから多くの値を読み込むことができます。あなたのアイデアをサポートする記事は見つかりませんでした。 http://dba.stackexchange.com/q/4968 –

+1

すべてのプログラムが最後にマシンコードにコンパイルされ、番号がレジスタにロードされます。最新のCPUアーキテクチャでは、すべてのレジスタが32ビットまたは64ビットです。したがって、RDBMSシステムは、照会の条件を満たすために比較を行うために、これらの数値をレジスタに入れる必要があります。そして、小さなintとintの場合は、毎回変換する必要があり、時間がかかります。 intを使用するとインデックスのサイズが増え、より多くのIOを必要とするため、通常はCPUとIOの間のトレードオフなので、私のポイントやポイントをサポートするオフィシャル記事を見つけることはできません。 – Ender

9

年()のデータ型を に使用することができます。これは2桁または4桁の形式で使用できます。

注:値は、4桁形式で許可さ:1901 2155までの値が2桁の形式で許可さ:70年表す69、1970年から2069

2

に理想的に依存することになるMSSQLに「年」を記憶しますあなたがそれを使って何をしているのか、その "年"の意味があなたのアプリケーションとデータベースにどのようなものになるのかということです。それはここに述べるべきことがいくつかあると言われています。 MSSQLには2012年の「データ型」はありません。私はそれがわずか2バイト(INTが要求する4バイトの2を節約する)であるので、SMALLINTを使用する方に傾くでしょう。 SQL Server 2008 R2の時点で32767年を超えることはできません。私は本当にSQLが今から1万年後のデータベースであるとは思っていません32767。あなたはMSSQLのYear()関数としてINTをデータ型 "DATE"をINTに変換すると考えるかもしれません。私が言ったように、それはあなたがデータを取得している場所とどこに行くのかに依存しますが、SMALLINTはちょうどいいはずです。上記のような他の理由がある場合や、コード要件でINT形式(たとえば、既存のアプリケーションとの統合など)で必要とする場合を除き、INTは過剰なものになります。ほとんどの場合、SMALLINTはうまくいくはずです。

0

ストレージは問題の一部にすぎません。この値はクエリでどのように使用されますか?

これは、別の日付/時刻データ型と比較されるか、関連するすべての行にも数値がありますか?

要件の変更にどう対処しますか?年を小さなタイムスライスに置き換える要求に、どのくらい簡単に反応できますか?つまり今は四半期ごとに分割したいと思っていますか?

数値型は、開始日と終了日(1/1/X〜12/31/x)などを含むルックアップテーブルを持つことで、日付クエリで簡単に使用できます。

関連する問題