我在夏令时周围遇到一个有趣的问题。
因此,我有一些SQL Server表可用于记录24小时电话服务热线的呼叫。我有一个 FactCalls 表和一个 dimTime 表(间隔15分钟)。 dimTime 如下所示; (仅显示10月28日,在夏时制转换期间)
TimeIntervalID DateTime
274272 2018-10-28 00:45:00.0000000 +01:00
274273 2018-10-28 01:00:00.0000000 +01:00
274274 2018-10-28 01:15:00.0000000 +01:00
274275 2018-10-28 01:30:00.0000000 +01:00
274276 2018-10-28 01:45:00.0000000 +01:00
274277 2018-10-28 01:00:00.0000000 +00:00
274278 2018-10-28 01:15:00.0000000 +00:00
274279 2018-10-28 01:30:00.0000000 +00:00
274280 2018-10-28 01:45:00.0000000 +00:00
274281 2018-10-28 02:00:00.0000000 +00:00
因此DimTime表将datetime值存储为DATETIMEOFFSET,以考虑夏令时的更改(从GMT到BST)。 Fact表连接到TimeIntervalID上的DimTime表(因为我们只对15分钟的块感兴趣)
现在,我已经在SSAS中创建了表格多维数据集,以导入DimTime和FactCalls表。我想将DimTime表标记为日期表,但是当我选择上面的datetime列作为唯一的日期值时,它向我抛出以下错误;
如何使多维数据集将夏令时存储为唯一值?由于似乎没有像SQL数据库引擎中那样将日期格式设置为DATETIMEOFFSET的选项(请参见上面的屏幕)
答案 0 :(得分:2)
从datetimeoffset到datetime的默认转换只是简单地将偏移量截断并返回datetime偏移量的本地时间部分,从而导致DST更改期间的值重复。
如错误所述,您将需要在DimTime中每隔15分钟间隔一行。
您需要将所有日期时间转换为一个时区,以加载日期表。在SQL Server中,通常的神奇咒语是convert(datetime2(0), [dto_column],1)
,它将以UTC时间结束。
例如:
declare @t table(dso datetimeoffset)
insert into @t values ('2018-10-28 01:45:00.0000000 +01:00'),('2018-10-28 01:00:00.0000000 +00:00')
select dso,
convert(datetime2(0), dso,1) dt_utc
from @t
输出
dso dt_utc
---------------------------------- ---------------------------
2018-10-28 01:45:00.0000000 +01:00 2018-10-28 00:45:00
2018-10-28 01:00:00.0000000 +00:00 2018-10-28 01:00:00
然后,如果您真的需要知道某个特定事件发生在一天中的哪个小时,则将其存储在事实中,而不是日期维度中。但是对于大多数情况而言,报告并不重要。