如何使用夏时制SSAS表格强制使用唯一的DateTime值

时间:2019-03-15 17:09:47

标签: sql-server datetime cube ssas-tabular

我在夏令时周围遇到一个有趣的问题。

因此,我有一些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列作为唯一的日期值时,它向我抛出以下错误;

ssas_tabluar_cube_unique_date_error

如何使多维数据集将夏令时存储为唯一值?由于似乎没有像SQL数据库引擎中那样将日期格式设置为DATETIMEOFFSET的选项(请参见上面的屏幕)

1 个答案:

答案 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

然后,如果您真的需要知道某个特定事件发生在一天中的哪个小时,则将其存储在事实中,而不是日期维度中。但是对于大多数情况而言,报告并不重要。