我正在寻找一种解决方案,使用包含当前系统时间的开始和停止时间快速有效地搜索记录。我希望我能找到一种解决方案,它不要求SQL Server对存储在表中的数据格式执行数学或转换。可以使用第二组值来计算夏令时,并且查询逻辑可以在执行之前确定美国夏令时规则是否有效。我的目的是使用UTC作为当前时间,因此逻辑可以移动到Azure或其他数据中心,并且与位置无关。
我考虑过的解决方案但发现原因不足:
当前使用的解决方案使用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对于这些前景。
如果我之前不清楚,我正在寻找一种方法来跟踪时间范围,而不是这些记录的日期范围。