在我们的应用程序中,UI中有一个报告模块,管理员可以从中查看报告。管理员将可以选择from_date和to_date。在交易过程中,我们将实时数据存储在几个表中,这些表都可以作为核心表。数据存储在UTC时区的这些表中。我们每30分钟运行一次调度程序,并将核心表中的数据转换为一天内事务数、响应时间等报告所需的数据。要求是,对于管理员来说,显示的数据应该基于浏览器的时区。管理员分布在多个时区。我们如何存储数据以及如何检索数据?每次发送请求时,我们都无法计算值。
将事务存储为UTC是可以的,通常是推荐的做法。
如注释中所建议的那样,使用TIMESTAMP WITH TIMEZONE
进行存储还有一个额外的好处,那就是知道什么本地时间和时区将应用于事务数据。这也可以,但这不是你所要求的。
你说:
要求是,对于管理员来说,显示的数据应该基于浏览器的时区。
我认为这意味着,无论数据库中的时间是以UTC设置的,还是以带有时区的本地时间设置的,您都希望在输出期间将数据转换为查看报告的人的时区。
但你也说过:
每次发送请求时,我们都无法计算值。
好吧,由于每个查看器可能都有不同的数据,我很抱歉告诉你,但这正是你必须做的。无论生成报告的应用程序逻辑是什么,都必须将数据的时间戳转换为查看器的本地时间。这通常不是在数据库中完成的,而是在中间层的应用程序逻辑中完成的。如果直接针对数据库生成报告,则某些报告引擎具有操作与报告本身关联的代码或脚本中的时间戳的功能。
无论结果如何,您都应该确保在这些报告的某个地方(可能在页脚)输出时区。人类经常会做一些事情,比如通过电子邮件将报告输出给他们的主管、客户等,他们显然可能在不同的时区。
在oracle存储中日期
create table myTable (
Id NUMBER(19) not null,
MyTime DATE not null,
);
在Java中,处理java.util.Date
,但在存储之前,请将其转换为java.util.Calendar
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.setTime(date);
现在您可以将其存储在基本中