我有一个围绕夏令时出现的有趣问题。
所以我有一些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列作为唯一日期值时,它会抛出以下错误;
如何将多维数据集存储为夏令时作为唯一值?因为似乎没有选项将日期格式化为DATETIMEOFFSET,就像在SQL数据库引擎中那样(参见上面的屏幕)
从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
然后,如果您确实需要知道特定事件发生在什么时间,那么将存储在事实中,而不是日期维度。但对于大多数情况来说,报告并不重要。