sql-server - 使用UTC和时区查询时间范围内的记录
问题描述
我正在寻找一种解决方案,以使用包含当前系统时间的开始和停止时间快速有效地搜索记录。我希望我能找到一个不需要 SQL Server 对存储在表中的数据格式执行数学运算或转换的解决方案。可以使用第二组值来计算夏令时,并且查询逻辑可以在执行之前确定美国夏令时规则是否有效。我的意图是在当前时间使用 UTC,以便逻辑可以移动到 Azure 或其他数据中心并且与位置无关。
我考虑过但发现不足的解决方案:
- 以小时或分钟为增量存储基于整数的 UTC 偏移量。当时间范围超过 24 小时标记时,我无法执行这样的操作:@CURRENT_HOUR BETWEEN 16 AND 4。
- 仅存储基于时间的字符串(例如:09:00 和 18:00)。这些值必须转换为日期时间值才能与另一个日期时间值进行比较。
当前使用的解决方案使用 UTC 偏移量计算每条记录的当前时间,这需要 SQL Server 的工作量超过此操作所需的工作量。
我发现最好的解决方案是使用 DATETIMEOFFSET 格式,将值设置为统一的 1900-01-01 格式,以便记录与日期无关,并且只需要相应地调整当前系统时间。
数据
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
询问
-- 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对于这些前景。
如果我之前不清楚,我正在寻找一种仅跟踪时间范围的方法,而不是这些记录的日期范围。
解决方案
推荐阅读
- r - http://localhost:8000/mapTiles/OSM/{z}_{x}_{y}.png 不工作 - SHINY R
- javascript - 复制后重新显示文本文件中的文本
- visual-studio-code - 我可以在没有密码的情况下使用“Vscode 远程 SSH”扩展吗?
- jquery - 在全屏模式下,引导工具提示不可见
- java - 当它被 (az) 包围时,从字符串中删除破折号而不是从中间删除
- sql - 从多行字符串中提取单词
- javascript - 优化柴测试
- python - TheHive / Cortext - 在分析器脚本中添加 observable
- flutter - 如何在 Flutter 桌面应用程序(macOS)中添加半透明效果?
- bash - OhMyZsh:使用自定义多行别名/函数覆盖 Git 插件别名