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 天”,我对存储未来两天的特定日期不感兴趣,因为我希望用户每隔一天查看接下来两天的事件他查看应用程序的时间。

我正在使用 Microsoft SQL Server 2008,如果它有什么不同的话。

(这可能是重复的,但我所有的搜索尝试都出现了关于datediff——用于计算时差——但没有关于如何最好地存储时差的结果。)

4

1 回答 1

1

标准 SQL 具有特定的日期和持续时间数据类型:interval。SQL Server 不支持区间数据类型。

DateDiff() 返回一个有符号整数。如果您需要存储相当于 SQL 间隔的 SQL Server,则需要存储一个整数。整数是对日期部分边界数的计数,因此您需要存储整数所指的日期部分边界类型。如果没有日期部分,有符号整数 3 可以很容易地表示 3 年或 3 秒。

实际上,我认为我宁愿计算提醒的时间戳,并将其存储不是定义间隔的整数和日期部分。时间戳可以比整数和日期部分更简单地被索引和查询。在不需要支持重复事件的情况下,我认为没有令人信服的理由来构建比这更复杂的解决方案。

于 2013-03-18T14:06:03.957 回答