相关疑难解决方法(0)

当数据依赖于日期时间时,在数据库中保存日期时间和时区信息的最佳做法

关于在DB中保存日期时间和时区信息有很多问题,但总体水平更多.在这里,我想谈谈一个具体的案例.

系统规格

  • 我们有一个订单系统数据库
  • 这是一个多租户系统,租户可以使用任意时区(每个租户是任意的,但是单个时区,一次保存在租户表中,永不改变)

DB中需要涵盖业务规则

  • 当租户将订单放入系统时,订单编号将根据其本地日期时间计算(它不是字面上的数字,而是某种类型的标识符ORDR-13432-Year-Month-Day).精确计算目前并不重要,重要的是它取决于租户的本地日期时间
  • 我们还希望能够在系统级别上选择所有订单,放置在某些UTC日期时间之间,而不管租户如何(对于一般系统统计/报告)

我们最初的想法

  • 我们最初的想法是在整个数据库中保存UTC日期时间,当然,保持租户时区相对于UTC的偏移量,并且使用DB的应用程序总是将日期时间转换为UTC,以便DB本身始终使用UTC.

方法1

  • 保存当地租户的日期时间对每个租户来说都不错,但是我们遇到的问题包括:

    SELECT * FROM ORDERS WHERE OrderDateTime BETWEEN UTCDateTime1 AND UTCDateTime2
    
    Run Code Online (Sandbox Code Playgroud)

这是有问题的,因为OrderDateTime在这个查询中意味着基于租户的不同时刻.当然,此查询可能包括连接到Tenants表以获取本地日期时间偏移量,然后将在运行中进行计算OrderDateTime以进行调整.这是可能的,但不确定这是否是一个好方法呢?

方法2

  • 另一方面,当保存UTC日期时间时,那么当我们计算OrderNumber时,因为UTC中的日/月/年可能与本地日期时间不同

让我们举一个极端的例子; 让我们说租户比UTC早6个小时,他的当地日期时间是2017-01-01 02:00.UTC会是2016-12-31 20:00.此时下达的订单应该获得OrderNumber 'ORDR-13432-2017-1-1'但是如果保存UTC则会得到ORDR-13432-2016-12-31.

在这种情况下,在DB中创建Order时,我们应该根据重新计算的租户本地时间获得UTC日期时间,租户偏移和编译OrderNumber,但仍然以UTC格式保存DateTime列.

问题

  1. 处理这种情况的首选方法是什么?
  2. 是否有一个很好的解决方案,保存UTC日期时间,因为系统级报告,这对我们来说会很好吗?
  3. 如果使用保存UTC,是方法2)处理这些情况的好方法还是有一些更好/推荐的方式?

[UPDATE]

根据Gerard Ashton和Hugo的评论:

如果租户可以改变时区,那么最初的问题就细节而言并不明确,如果政治当局改变时区属性或某个时区的时区会发生什么.当然,这是非常重要的,但它不是这个问题的核心.我们可以在另一个问题中解决这个问题.

为了这个问题,让我们假设租户不会改变位置.该位置的时区属性或时区本身可能会发生变化,这些更改将在系统中与此问题分开处理.

timezone datetime utc datetimeoffset dst

30
推荐指数
2
解决办法
3万
查看次数

什么是"标准"时区缩写?

我使用此下拉列表为应用程序存储与UTC相关的时区:

<select id="timezone" name="timezone" >
<option value="-12">[UTC - 12] Baker Island Time</option>
<option value="-11">[UTC - 11] Niue Time, Samoa Standard Time</option>
<option value="-10">[UTC - 10] Hawaii-Aleutian Standard Time, Cook Island Time</option>
<option value="-9.5">[UTC - 9:30] Marquesas Islands Time</option>
<option value="-9">[UTC - 9] Alaska Standard Time, Gambier Island Time</option>
<option value="-8">[UTC - 8] Pacific Standard Time</option>
<option value="-7">[UTC - 7] Mountain Standard Time</option>
<option value="-6">[UTC - 6] Central Standard Time</option>
<option value="-5">[UTC - 5] Eastern Standard Time</option>
<option value="-4.5">[UTC …
Run Code Online (Sandbox Code Playgroud)

php time timezone utc gmt

14
推荐指数
1
解决办法
6105
查看次数

标签 统计

timezone ×2

utc ×2

datetime ×1

datetimeoffset ×1

dst ×1

gmt ×1

php ×1

time ×1