如何使用夏令时 SSAS 表格强制使用唯一的日期时间值

How to force unique DateTime Values with Daylight Savings SSAS Tabular

我有一个关于夏令时的有趣问题。

所以我有一些 SQL 服务器 table 用于记录 24 小时电话服务热线的呼叫。我有一个 FactCalls table 和一个 dimTime table (分为 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 table 将日期时间值存储为 DATETIMEOFFSET 以考虑夏令时的变化(GMT 到 BST)。 Fact table 在 TimeIntervalID 上加入 DimTime table(因为我们只对 15 分钟的块感兴趣)

现在我已经在导入 DimTime 和 FactCalls table 的 SSAS 中创建了一个表格立方体。我想将 DimTime table 标记为日期 table 但是当我选择上面的日期时间列作为唯一日期值时,它会抛出以下错误;

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

从 datetimeoffset 到 datetime 的默认转换只是截断偏移量和 returns 日期时间偏移量的本地时间部分,导致 DST 更改期间出现重复值。

如错误所述,您需要在 DimTime 中为每 15 分钟的间隔留出一行。

您需要将所有日期时间转换为单个时区才能加载日期 table。在 SQL 服务器中,正常的魔法咒语是 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

然后,如果您真的需要知道特定事件发生在一天中的几小时,那将存储在事实中,而不是日期维度中。但对于大多数场景来说,它对报告并不重要。