使用UTC和时区查询时间范围内的记录

时间:2018-06-11 17:43:11

标签: sql-server sql-server-2008-r2 utc datetimeoffset

我正在寻找一种解决方案,使用包含当前系统时间的开始和停止时间快速有效地搜索记录。我希望我能找到一种解决方案,它不要求SQL Server对存储在表中的数据格式执行数学或转换。可以使用第二组值来计算夏令时,并且查询逻辑可以在执行之前确定美国夏令时规则是否有效。我的目的是使用UTC作为当前时间,因此逻辑可以移动到Azure或其他数据中心,并且与位置无关。

我考虑过的解决方案但发现原因不足:

  • 以小时或分钟为增量从UTC存储基于整数的偏移量。当时间范围跨越24小时标记时,我无法执行这样的操作:@CURRENT_HOUR BETWEEN 16和4。
  • 仅存储基于时间的字符串(例如:09:00和18:00)。必须将这些值转换为日期时间值,以与另一个日期时间值进行比较。

当前使用的解决方案使用UTC偏移计算每条记录的当前时间,这需要比此操作所需的SQL Server更多的工作。

我发现使用DATETIMEOFFSET格式的最佳解决方案,将值设置为统一的1900-01-01格式,以便记录与日期无关,并且只需相应地调整当前系统时间。 / p>

数据

ZIP    CITY         ST  START_OFFSET            STOP_OFFSET             START_OFFSET_DST        STOP_OFFSET_DST
----------------------------------------------------------------------------------------------------------------------
10001  New York     NY  1900-01-01 09:00 -5:00  1900-01-01 18:00 -5:00  1900-01-01 09:00 -4:00  1900-01-01 18:00 -4:00
60601  Chicago      IL  1900-01-01 09:00 -6:00  1900-01-01 18:00 -6:00  1900-01-01 09:00 -5:00  1900-01-01 18:00 -5:00
80202  Denver       CO  1900-01-01 09:00 -7:00  1900-01-01 18:00 -7:00  1900-01-01 09:00 -6:00  1900-01-01 18:00 -6:00
85001  Phoenix      AZ  1900-01-01 09:00 -7:00  1900-01-01 18:00 -7:00  1900-01-01 09:00 -7:00  1900-01-01 18:00 -7:00
90001  Los Angeles  CA  1900-01-01 09:00 -8:00  1900-01-01 18:00 -8:00  1900-01-01 09:00 -7:00  1900-01-01 18:00 -7:00

QUERY

-- Get the current UTC date/time and adjust it to be 1900-01-01 with the current time and offset
DECLARE @UTC_TIME AS DATETIMEOFFSET = DATEADD(DAY, (DATEDIFF(DAY, SWITCHOFFSET(SYSDATETIMEOFFSET(), '+00:00'), '1900-01-01')) * 1, SWITCHOFFSET(SYSDATETIMEOFFSET(), '+00:00'))
SELECT  @UTC_TIME -- EXAMPLE: 1900-01-01 17:00:00.000000 +00:00

SELECT  TimeZoneId
FROM    dbo.TimeZones
WHERE   @UTC_TIME BETWEEN START_OFFSET AND STOP_OFFSET -- Ignoring DST logic for this example

这种方法的问题是一旦UTC滚过23:59,示例中的日期/时间将是1900-01-01 00:00:00而不是1900-01-02 00:00:00并且赢了比较时,它们落在预期的范围值之间。我希望有人能帮助我在计算更好的偏移量时找到树林,或者为数据结构提供新的方法,这样仍然可以让查询避免计算。

这个逻辑需要在SQL Server 2008上运行,我不想实现CLR来解决它。

编辑: 此数据查询的目的是确定美国区域内B2B营销的合理呼叫时间。如果我们没有潜在客户的邮政编码数据,我们主要使用带有偏移时区的邮政编码并回退到州。我们的数据是99%在美国,在关岛,波多黎各等地有一些记录。如果记录给出误报,它不是世界末日,但我们确实试图限制我们的营销电话到当地时间9A到6P对于这些前景。

如果我之前不清楚,我正在寻找一种方法来跟踪时间范围,而不是这些记录的日期范围。

0 个答案:

没有答案