1

私のアプリケーションには、イベントのカレンダーを格納するデータベースがあります。

 id |        name        |        date
----+--------------------+--------------------
  1 | Birthday Party     | 2013-04-27 16:30:00
  2 | Dinner Reservation | 2013-03-20 17:00:00
  3 | Sunday Brunch      | 2013-03-31 11:15:00

アプリケーションでイベントを表示する場合、ユーザーは、データベースに値として保存されている、イベントを表示したい現在の瞬間からどれだけ前に設定できる必要があります。

 username |     datediff
----------+------------------------------------------
  user123 |  2 days in advance
  goodguy |  93 days in advance
  spudly  |  365 days in advance
  aaaaaa  |  17 days, 3 hours, 30 seconds in advance

私の質問は、そのような日付の差を保存するための最良の(つまり、SQLの慣用的な)方法は何ですか?時間差をミリ秒単位の数値として格納できますが、特定の時点だけでなく、日付の差に適した組み込みのSQLデータ型はありますか?このタスクには、DATETIMEやTIMESTAMPのようなものが適切ですか?

これは相対的な違いである必要があります。たとえば、「2日前」の場合、ユーザーに次の2日間のイベントを毎回表示してもらいたいので、2日後の特定の日付を保存することに興味はありません。彼がアプリケーションを見るとき。

違いがあれば、Microsoft SQLServer2008を使用しています。

(これは重複している可能性がありますが、私の検索の試みはすべて、時間差の計算datediffに使用される-についての結果を示していますが、時間差を保存するための最良の方法については何もありません。)

4

1 に答える 1

1

標準 SQL には、日付と時刻の期間に特定のデータ型である interval があります。SQL Server は interval データ型をサポートしていません。

DateDiff() は符号付き整数を返します。SQL 間隔に相当する SQL Server を格納する必要がある場合は、整数を格納する必要があります。整数は datepart 境界の数のカウントであるため、整数が参照する datepart 境界の種類も格納する必要があります。datepart がなければ、符号付き整数 3 は 3 年または 3 秒を簡単に意味する可能性があります。

実際問題として、間隔を定義する整数と日付部分の代わりに、リマインダーのタイムスタンプを計算し、それを保存たいと思います。タイムスタンプは、整数や日付部分よりもはるかに簡単にインデックスを作成してクエリを実行できます。また、定期的なイベントをサポートする必要がなければ、それよりも複雑なソリューションを構築する説得力のある理由はないと思います。

于 2013-03-18T14:06:03.957 に答える