Лучший способ хранить дни недели с временными промежутками

Я создаю медленно изменяющуюся таблицу измерений, чтобы вести журнал, когда кто-то менял расписание и на что он менялся.

Это потребовало от меня хранения дней недели со временем начала и временем окончания, связанным с ним. Информация находится в таблице, структурированной с идентификатором пользователя, днем ​​недели, временем начала, временем окончания, а затем имеет строки значений для каждого дня недели для каждого пользователь.

Каков наилучший способ сгладить это и сохранить в таблице, где я могу получить время начала остановки для любого дня недели. Я думал о столбцах для каждого дня недели со временем начала и окончания. Например, понедельник_начало, понедельник_конец. Конкретная дата, на которую приходится этот день недели, не имеет значения, поскольку этот аспект регистрируется в столбцах rowstartdate и rowenddate.


person WBratz    schedule 17.08.2015    source источник
comment
Является ли это истинной таблицей измерений в звездообразной схеме, и в этом случае что представляет одна строка в таблице измерений? Или вам нужна форма нормализованной структуры таблицы? (Небольшой вопрос, какую версию SQL вы используете, например, есть ли у вас доступ к типу данных времени?)   -  person Philip Kelley    schedule 17.08.2015
comment
Итак, это большая таблица, заполняемая различными меньшими таблицами, это истинное измерение в звездообразной схеме, верно? Целью этой таблицы является ведение исторической записи о том, когда и какие изменения произошли. И MS SQL 2012, так что да время имеется.   -  person WBratz    schedule 17.08.2015


Ответы (1)


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

Предполагая, что у вас есть измерение типа 2 как таковое:

 UserID
,DayOfWeek
,StartWorkTime
,EndWorkTime
,EffectiveStartDate
,EffectiveEndDate
,Current -- Y/N Flags for being current or not current

Вы можете эффективно создать представление базы данных, которое сводило StartWorkTime и EndWorkTime к столбцам UserID и Current.

 CREATE VIEW [schema].[view_name] AS
 SELECT
    UserID
   ,[Current] -- Y = Yes / N = No
   ,MAX(CASE WHEN DayOfWeek = 2 THEN StartWorkTime  ELSE NULL END) AS Mon_StartWorkTime
   ,MAX(CASE WHEN DayOfWeek = 2 THEN EndWorkTime    ELSE NULL END) AS Mon_EndWorkTime 
   ,MAX(CASE WHEN DayOfWeek = 3 THEN StartWorkTime  ELSE NULL END) AS Tue_StartWorkTime
   ,MAX(CASE WHEN DayOfWeek = 3 THEN EndWorkTime    ELSE NULL END) AS Tue_EndWorkTime 
   ,MAX(CASE WHEN DayOfWeek = 4 THEN StartWorkTime  ELSE NULL END) AS Wed_StartWorkTime
   ,MAX(CASE WHEN DayOfWeek = 4 THEN EndWorkTime    ELSE NULL END) AS Wed_EndWorkTime 
   ,MAX(CASE WHEN DayOfWeek = 5 THEN StartWorkTime  ELSE NULL END) AS Thu_StartWorkTime
   ,MAX(CASE WHEN DayOfWeek = 5 THEN EndWorkTime    ELSE NULL END) AS Thu_EndWorkTime 
   ,MAX(CASE WHEN DayOfWeek = 6 THEN StartWorkTime  ELSE NULL END) AS Fri_StartWorkTime
   ,MAX(CASE WHEN DayOfWeek = 6 THEN EndWorkTime    ELSE NULL END) AS Fri_EndWorkTime 
 FROM [database].[schema].[table_name]
 WHERE [Current] = 'Y'
 GROUP BY
    UserID
   ,[Current]

Тогда ваши результаты будут для одного сотрудника, работающего с 08:00 до 16:00 в некоторые дни и до 1200 в другие дни как таковые:

UserID  Current Mon_StartWorkTime   Mon_EndWorkTime     Tue_StartWorkTime   Tue_EndWorkTime     Wed_StartWorkTime   Wed_EndWorkTime     Thu_StartWorkTime   Thu_EndWorkTime     Fri_StartWorkTime   Fri_EndWorkTime
1       Y       08:00:00.0000000    16:00:00.0000000    08:00:00.0000000    16:00:00.0000000    08:00:00.0000000    16:00:00.0000000    08:00:00.0000000    12:00:00.0000000    08:00:00.0000000    12:00:00.0000000
person Glen Swan    schedule 19.08.2015