6

データベースに保存したい本のリストがあります。属性の1つは、本が最初に出版された日付です。古い本(100年以上)の中で、私はしばしば10年(185Xなど)を知っているか、非常に古い本の場合は1世紀(15XXなど)を知っています。

これらの日付をdatetime2フィールドにどのように保存しますか?1500として15XX?たとえば、100年以上前の本を検索できるようにしたい。だから私はどういうわけかそれらの値を有効なdatetime2値として保存したいと思います。何かお勧めはありますか?'1500-01-0100:00'としての15XXは私には合理的なようです。そのアプローチの欠点はありますか?

4

6 に答える 6

4

唯一の欠点は、誰かが1550年から1650年までに出版されたすべての本を要求した場合です。あなたの15XXは1500になったので、彼の結果には含まれません。

あなたが本当に持っているのは、与えられた本が出版されたときの不確実な期間です。2つの日付を保存します。1つは期間の開始時、もう1つは期間の終了時です。現代の本は同じ日付に設定されますが、最も古い本は1500-01-01 00:00-1599-12-3123:59として保存できます。

もちろん、それは選択を複雑にします。あなたはそれが価値があるかどうかを決定しなければなりません。「1550から1650」を求めるのはばかげていると宣言するかもしれません。

于 2012-04-26T10:22:45.093 に答える
3

15XX@ dragon112の答えの延長として、最初の2つのオプションの両方として 必要になる可能性はありますか?(NULLが値であるのと同じように、同時に値ではありません。)

  • その本の可能な限り古い日付(15xxの場合は1500になります)
  • その本の可能な限り最年少の日付(15xxの場合は1599になります)

その場合、2つの日付を保存し、本が出版された日付範囲を作成できます。

これにより、クエリ/システムがより複雑になります。これらのSQLボットを作成する場合、構文的には正しいですが、異なる結果をもたらす可能性があるため、特定の状況で適切なものを選択する必要があります...

WHERE
  earliestPublishDate > '1550-01-01'

WHERE
  latestPublishDate > '1550-01-01'


したがって、データの保存方法を決定する際の最も重要な質問は次の
とおりです。-どのようにデータを調査しますか?

正しいデータ表現を決定するには、ユースケース(またはおそらくユースケース)を知る必要があります。

于 2012-04-26T10:23:24.177 に答える
1

日付とともに時刻を保存する必要がない場合は、データ型「Date」を使用します。datetime2に移動して、01-01-0001からの日付を許可する必要はありません。

日付は、0001-01-01から9999-12-31までの日付もサポートします。Datetime2は、datetimeよりも時間の精度が高くなります。

于 2012-04-26T10:17:49.800 に答える
1

私の意見では、そのような本の日付を保存する3つの方法があります。

  • その本の可能な限り古い日付(15xxの場合は1500になります)
  • その本の可能な限り最年少の日付(15xxの場合は1599になります)
  • 上記の途中(15xxの場合は1550になります)

これらのアプローチはコード自体には関係ありませんが、特定の年齢を照会すると結果に影響します。ですから、私の意見では、あなたにとって最も良いと感じるものは何でも問題ないはずです。

言い換えれば、500年前の本を検索するときに、15xx以降の本を入手したいですか?現在は2012年であるため、本はデータベースから返されません(2012-500 = 1512)。

于 2012-04-26T10:14:13.723 に答える
1

興味深い質問ですが、次の解決策を検討します。

値を2つのフィールドとしてデータベースに保存します。最初のものは、ソートのために「1500-01-0100:00」と述べた形式で保存されます。2番目のフィールドは、元の値15XXを記録するために使用され、そのデータ型は英数字タイプです。

このアプローチを使用すると、データが不明であるという事実を失うことはありません。しかし、それでも、特定の日付より古い本を検索するという要件を満たしています。

日時フィールドは、英数字フィールドから厳密に計算されます。

于 2012-04-26T10:14:38.513 に答える
0
DECLARE @var VARCHAR(100)
SET @var = ''
SET @var =  CASE LEN(@var) 
                WHEN 1 THEN @var + '000' 
                WHEN 2 THEN @var + '00' 
                WHEN 3 THEN @var + '0' 
                ELSE @var 
            END
SELECT CAST(@var AS DATE)
于 2012-04-26T11:04:44.170 に答える