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建议将翻译用于用户友好的价值是好的.但是,我建议用户界面层,而不是中间层,是这样做的地方,因为可能最合理或可口的可能会有所不同,这取决于您是在谈论报告还是数据输入表格和观众是内部还是外部.例如,您可能想要的一些地方是一个简单的空白.其他人你可能想要"永远"这个词.其他人你可能想要一个带有复选框的空文本框,上面写着"直到进一步通知".
在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为合适的值.