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

问题描述 投票:0回答:1

我有一个围绕夏令时出现的有趣问题。

所以我有一些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表将日期时间值存储为DATETIMEOFFSET,以考虑夏令时的变化(GMT到BST)。 Fact表连接到TimeIntervalID上的DimTime表(因为我们只对15分钟块感兴趣)

现在我在SSAS中创建了一个表格多维数据集,导入了DimTime和FactCalls表。我想将DimTime表标记为日期表,但是当我选择上面的datetime列作为唯一日期值时,它会抛出以下错误;

ssas_tabluar_cube_unique_date_error

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

sql-server datetime cube ssas-tabular
1个回答
2
投票

从datetimeoffset到datetime的默认转换只是截断偏移量并返回日期时间偏移量的本地时间部分,从而在DST更改期间产生重复值。

如错误所示,您需要在每个15分钟的间隔内在DimTime中有一行。

您需要将所有日期时间转换为单个时区以加载日期表。 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

然后,如果您确实需要知道特定事件发生在什么时间,那么将存储在事实中,而不是日期维度。但对于大多数情况来说,报告并不重要。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.