2015-08-17 1 views
2

Je crée une table de dimension changeant lentement pour tenir un journal quand quelqu'un a changé un calendrier et ce qu'ils ont changé pourmeilleure façon de stocker jours de la semaine avec le temps Portées

Cela me requis pour stocker Jours de la semaine avec une heure de début et une heure de fin associées, l'information est dans une table structurée avec UserID, Jour de la semaine, StartTime, EndTime puis a des lignes de valeurs pour chaque jour de la semaine pour chaque utilisateur.

Quelle est la meilleure façon de l'aplanir et de l'enregistrer dans une table où je peux récupérer les heures d'arrêt de démarrage pour n'importe quel jour de la semaine. Je pensais à des colonnes pour chaque jour de la semaine avec une heure de début et d'arrêt. Par exemple Monday_Start, Monday_End. La date particulière sur laquelle tombe ce jour de la semaine n'est pas pertinente car cet aspect est enregistré par une colonne rowstartdate et une colonne rowenddate.

+1

Est-ce une vraie table de dimension dans un schéma en étoile, auquel cas ce une rangée dans la table de dimension représente-t-elle? Ou, avez-vous besoin d'une forme de structure de table normalisée? (Question mineure, quelle version de SQL utilisez-vous, par exemple avez-vous accès au type de données "time"?) –

+0

Donc c'est une grande table peuplée de plusieurs tables plus petites, c'est une vraie dimension dans un schéma en étoile, correct ? Le but de cette table est de garder un historique de quand et quels changements sont survenus. Et MS SQL 2012, donc oui le temps est disponible. – WBratz

Répondre

0

Je ne vois pas pourquoi une vue de base de données ne pourrait pas être utilisée ici à l'aide d'un champ d'indication de courant.

En supposant que vous aviez un type 2 Dimension en tant que tel:

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

Vous pouvez créer efficacement une vue de base de données qui pivote StartWorkTime et EndWorkTime sur colonnes et UserID actuelles.

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] 

Ensuite, vos résultats seront pour un employé travaillant 0800 à 1600 quelques jours et à 1200 autres jours en tant que tels:

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