如何在数据库中表示时间结束?

msk*_*her 6 database time database-design 32bit-64bit

我想知道如何在数据库中表示一个时间结束(正无穷大)值.

当我们使用32位时间值时,显而易见的答案是实际的32位时间结束 - 接近2038年的时间.
现在我们使用的是64位时间值,我们无法在DATETIME字段中表示64位的结束时间,因为64位的结束时间是从现在开始的数十亿年.

由于SQL Server和Oracle(我们的两个支持平台)都允许多达9999年,我认为我们可以选择一些"大"的未来日期,如1/1/3000.
但是,由于客户和我们的质量保证部门都会查看数据库值,我希望它显而易见,而不是像某人搞砸他们的日期算术.

我们只是选择约会并坚持下去吗?

Joe*_*own 12

使用最大整理日期,具体取决于您的DBMS,可能是9999-12-31.你想这样做是因为如果你尝试采用"纯粹主义"的方法,比如使用Null,如某些评论者的建议或使用永久性标志,如Marc B所建议的那样,基于日期范围的查询将很快变得非常复杂.

当您在日期范围内使用最大整理日期表示"永远"或"直到另行通知"时,它会产生非常简单,自然的查询.它使这些查询非常简单明了:

  • 找到我在给定时间点生效的记录.
    ... WHERE effective_date <= @PointInTime AND expiry_date >= @PointInTime
  • 找到我在以下时间范围内生效的记录.
    ... WHERE effective_date <= @StartOfRange AND expiry_date >= @EndOfRange
  • 找到具有重叠日期范围的记录.
    ... WHERE A.effective_date <= B.expiry_date AND B.effective_date <= A.expiry_date
  • 找到没有过期的记录.
    ... WHERE expiry_date = @MaxCollatingDate
  • 找到没有记录生效的时间段.
    好的,所以这个并不简单,但使用最终整理日期更简单.请参阅: 这个问题 是一个好方法.

使用这种方法可能会给某些用户带来一些问题,他们可能会发现"9999-12-31"在报告或屏幕上混淆.如果这对你来说是一个问题,那么drdwicox建议将翻译用于用户友好的价值是好的.但是,我建议用户界面层,而不是中间层,是这样做的地方,因为可能最合理或可口的可能会有所不同,这取决于您是在谈论报告还是数据输入表格和观众是内部还是外部.例如,您可能想要的一些地方是一个简单的空白.其他人你可能想要"永远"这个词.其他人你可能想要一个带有复选框的空文本框,上面写着"直到进一步通知".

  • 你必须是某种政府雇员才能享受持续8000年的福利!虽然使用最大整理日期在日期范围操作方面确实可以节省时间,但这并不是偷懒的借口。不幸的是,您的福利系统是由专注于数据操作而不是用户界面的人开发的。 (2认同)

Mik*_*ll' 9

在PostgreSQL中,时间的结束是"无限".它还支持'-infinity'."无限"值保证晚于所有其他时间戳.

create table infinite_time (
  ts timestamp primary key
);

insert into infinite_time values
(current_timestamp),
('infinity');

select *
from infinite_time
order by ts;

2011-11-06 08:16:22.078
infinity
Run Code Online (Sandbox Code Playgroud)

至少从版本8.0开始,PostgreSQL支持'无限'和'无限'.

您至少可以通过使用dbms支持的最大日期来模仿此行为.但最长日期可能不是最佳选择.PostgreSQL的最大时间戳是294,276的一段时间,这肯定会让一些人感到惊讶.(我不喜欢让用户感到惊讶.)

2011-11-06 08:16:21.734
294276-01-01 00:00:00
infinity
Run Code Online (Sandbox Code Playgroud)

像这样的值可能更有用:'9999-12-31 11:59:59.999'.

2011-11-06 08:16:21.734
9999-12-31 11:59:59.999
infinity
Run Code Online (Sandbox Code Playgroud)

这不是9999年的最大值,但数字排列很好.您可以将该值包装在infinity()函数和CREATE DOMAIN语句中.如果从源代码构建或维护数据库结构,则可以使用宏扩展扩展INFINITY为合适的值.

  • @mskfisher:我认为我的回答远远不止“ PostgreSQL的工作方式”。 (3认同)
  • 不适用于我的情况,因为我没有使用 PostgreSQL,但有趣的是,现有的 DBMS 具有“无穷大”的概念。 (2认同)