Как принудительно установить уникальные значения DateTime с помощью табличного режима перехода на летнее время - PullRequest
0 голосов
/ 15 марта 2019

У меня есть интересная проблема, возникающая в связи с переходом на летнее время.

Поэтому у меня есть несколько таблиц SQL Server, которые я использую для записи звонков на круглосуточную телефонную линию.У меня есть таблица FactCalls и таблица dimTime (разбитые на 15-минутные интервалы). dimTime выглядит следующим образом;(показывается только 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).Таблица фактов соединяется с таблицей DimTime по TimeIntervalID (поскольку нас интересуют только 15-минутные блоки)

Теперь я создал табличный куб в SSAS, импортируя таблицы DimTime и FactCalls.Я хочу пометить таблицу DimTime как таблицу дат, но при выборе вышеупомянутого столбца даты и времени в качестве уникального значения даты возникает следующая ошибка:

ssas_tabluar_cube_unique_date_error

Как заставить куб хранить летнее время в виде уникальных значений?Поскольку нет возможности отформатировать дату как DATETIMEOFFSET, как в ядре базы данных SQL (см. Экран выше)

1 Ответ

2 голосов
/ 16 марта 2019

Преобразование по умолчанию из datetimeoffset в datetime просто усекает смещение и возвращает часть смещения даты и времени по местному времени, что приводит к дублированию значений во время изменений летнего времени.

Как говорит ошибка, вам понадобитсяодна строка в 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

Тогда, если вам действительно нужно знать, в какое время суток произошло конкретное событие, оно будет сохраненона самом деле, а не измерение даты.Но для большинства сценариев это не важно для отчетности.

...