3

私は一連の写真に関するメタデータを保持するデータベースを作成しようとしています.1つのフィールドは撮影日です。これを大まかな精度または細かい精度で保存できるようにしたいと考えています。たとえば、デジタル画像の場合、正確なタイム スタンプを秒単位まで取得できますが、画像にただのタグを付けられるようにしたいと考えています。特定の年、または特定の 10 年間に撮影されたもの (10 年間というのは、私が行く最も粗いものです) であり、90 年代のすべての写真、1992 年のすべての写真、またはすべての写真を要求するこの方法で検索することもできます。ある日の写真など

SQLでこれを行う方法が組み込まれているのか、それとももっと良い別の方法があるのか​​ 疑問に思っていました. 日付を分割して、各ピースを別々に保存することを考えました。たとえば、10 年フィールド、年フィールド、月フィールドなどを作成しましたが、これは少し不器用な方法のように思えました。

無料である限り、どの SQL テクノロジを使用するかは気にしません。現在H2を検討中です。

4

3 に答える 3

3

これは、タイムスタンプ用と精度レベル用の2つの列だけで実行できます。次に、精度のスケールと、タイムスタンプに低精度の日付をエンコードするための標準を定義する必要があります。

たとえば、精度スケールは次のようになります。

0   full timestamp
1   day
2   month
3   year
4   decade

これで、次のような日付を保存できます。

timestamp                 |  precision   | notes
--------------------------+--------------+---------------------
2012-07-05 14:00:00       |  0           | full precision
--------------------------+--------------+---------------------
2012-07-05 00:00:00       |  1           | precision up to day
--------------------------+--------------+---------------------
2012-07-01 00:00:00       |  2           | month and year
--------------------------+--------------+---------------------
2012-01-01 00:00:00       |  3           | year
--------------------------+--------------+---------------------
2010-01-01 00:00:00       |  4           | decade
--------------------------+--------------+---------------------
于 2012-07-28T22:10:45.177 に答える
3

正確な日付のあいまい検索では、各部分を個別に保存する必要はありません。where句を調整できます。2012 年以降のすべての場合:

SELECT * FROM yourtable
WHERE yourtime >= '2012-01-01' AND yourtime < '2013-01-01'

特定の日をご希望の場合:

SELECT * FROM yourtable
WHERE yourtime >= '2012-07-28' AND yourtime < '2012-07-29'

または特定の時間:

SELECT * FROM yourtable
WHERE yourtime >= '2012-07-28 13:00:00' AND yourtime < '2012-07-28 14:00:00'

これらすべてのクエリを効率的にするために、タイムスタンプ列にインデックスを追加できます。


あいまいな日付を保存する方法に関して、1 つのオプションは日付の範囲を持つことです。

id    taken_from            taken_to               title
1     2011-01-01 00:00:00   2012-01-01 00:00:00    a pic of my car last year

あいまいな日付のあいまい検索の場合、次のようなことができます。

あいまい日付検索

疑似 SQL の場合:

SELECT
    *,
    (LEAST(@to, taken_to) - GREATEST(@from, taken_from)) /
    (GREATEST(@to - taken_to) - LEAST(@from, taken_from)) AS relevancy
FROM yourtable
WHERE taken_to >= @from AND taken_from < @to

おそらく関連性で並べ替えたいと思うでしょうし、一部の検索用語の全文検索によって返される関連性など、他の要因を含めたいと思うかもしれません。

于 2012-07-28T21:58:54.593 に答える
1

過去に CHAR と VARCHAR を使用し、不足している部分を疑問符またはダッシュに置き換えました。疑問符は「不明」を意味し、ダッシュは「該当なし」を意味します。これは、ユーザー (複雑な訴訟の秘書やパラリーガル) にとっては十分に直感的であり、弁護士にとっては十分に柔軟であることが証明され、賢明に分類されました。

これ、「日付」が SQL 日付ではなくなったことを意味します。つまり、日付/時刻の演算と間隔の互換性は、まったく機能する場合でも、それほど堅牢ではありません。(「1960 年代プラス 20 日」とは何ですか?それはより長い 10 年ですか、それともシフトした 10 年ですか?) それが重要かどうかは、アプリケーションに依存します。あなたのアプリケーションには問題ないと思います。

詳細と注意事項はdba.stackexchange.comにあります

于 2012-07-28T22:47:35.313 に答える