【发布时间】:2011-11-25 09:45:13
【问题描述】:
我有一个带有 GMT 时间戳事件的数据库(SQL Server 2005,但我认为我的问题更笼统)。出于多种原因,我需要能够根据用户的本地时间查询和汇总数据。例如,当地时间下午 5 点到 7 点之间发生了多少事件? DST 真的让我在这个上循环。
我考虑过尝试维护一个包含所有时区/夏令时规则的表格。然后我可以将我的事件表加入其中,将结果限制为用户的时区/dst 信息。所以我的例子的查询看起来像:
select count(e.ID)
from events e
join dst d on e.timeGMT between d.startGMT and d.endGMT
where d.region=@userRegion
and dbo.getTime(dateadd(ss, d.offsetSec, e.timeGMT)) between '17:00' and '19:00'
这个 dst 表似乎很可能成为维护的噩梦。那么,有人有更好的选择吗?
更新 好吧,我的问题似乎有些混乱,所以我将提供一些示例数据......
首先,请注意,DST 在美国当地时间 11 月 6 日(星期日)02:00 结束。
鉴于以下事件表
create table events(ID int, timeGMT datetime)
insert into events(ID, timeGMT)
select 1, '2011-11-04 20:00' union --16:00 EDT
select 2, '2011-11-04 20:15' union --16:15 EDT
select 3, '2011-11-04 20:30' union --16:30 EDT
select 4, '2011-11-04 20:45' union --16:45 EDT
select 5, '2011-11-04 21:00' union --17:00 EDT
select 6, '2011-11-04 21:15' union --17:15 EDT
select 7, '2011-11-04 21:30' union --17:30 EDT
select 8, '2011-11-04 21:45' union --17:45 EDT
select 9, '2011-11-04 22:00' union --18:00 EDT
select 10, '2011-11-04 22:15' union --18:15 EDT
select 11, '2011-11-04 22:30' union --18:30 EDT
select 12, '2011-11-04 22:45' union --18:45 EDT
select 13, '2011-11-04 23:00' union --19:00 EDT
select 14, '2011-11-06 20:00' union --15:00 EST
select 15, '2011-11-06 20:15' union --15:15 EST
select 16, '2011-11-06 20:30' union --15:30 EST
select 17, '2011-11-06 20:45' union --15:45 EST
select 18, '2011-11-06 21:00' union --16:00 EST
select 19, '2011-11-06 21:15' union --16:15 EST
select 20, '2011-11-06 21:30' union --16:30 EST
select 21, '2011-11-06 21:45' union --16:45 EST
select 22, '2011-11-06 22:00' union --17:00 EST
select 23, '2011-11-06 22:15' union --17:15 EST
select 24, '2011-11-06 22:30' union --17:30 EST
select 25, '2011-11-06 22:45' union --17:45 EST
select 26, '2011-11-06 23:00' --18:00 EST
我正在寻找一种获得以下结果的好方法。假设本地开始时间为 17:00,本地结束时间为 18:00,本地时区为美国复活节。
ID | timeGMT
----|------------------
5 | 2011-11-04 21:00
6 | 2011-11-04 21:15
7 | 2011-11-04 21:30
8 | 2011-11-04 21:45
9 | 2011-11-04 22:00
22 | 2011-11-06 22:00
23 | 2011-11-06 22:15
24 | 2011-11-06 22:30
25 | 2011-11-06 22:45
26 | 2011-11-06 23:00
我还希望这适用于任何真实的 DST 规则集和所有时区。包括真实数据集跨越数年的事实,因此有数次 DST 变化。
更新 2 我已经基本实现了我最初概述的解决方案,但我还创建了一些代码来大幅减少所需的维护操作。
- 我解析了 tz 数据库(又名 zoneinfo、IANA 时区或 Olson 数据库,可用 here),输出所有 GMT 偏移变化的列表,这些年我必须担心的所有区域。李>
- 将列表插入到临时表中。
- 使用临时表为每个区域针对其具有的每个 GMT 偏移量构建时间范围。
【问题讨论】:
标签: sql sql-server-2005 timezone dst