使用时间跨度存储星期几的最佳方式
Best Way to store days of the week with Time Spans
我正在创建一个缓慢变化的维度 table 来记录某人何时更改日程以及他们将其更改为什么
这要求我存储星期几及其相关的开始时间和结束时间信息在 table 结构中,其中包含 UserID、星期几、StartTime、EndTime 然后有行每个用户一周中每一天的值。
将其展平并将其存储到 table 中的最佳方法是什么,我可以在其中检索一周中任何一天的开始停止时间。我在想一周中的每一天都有一个开始时间和停止时间的专栏。例如 Monday_Start、Monday_End。一周中的这一天所在的特定日期无关紧要,因为该方面由 rowstartdate 列和 rowenddate 列记录。
我看不出为什么不能在当前指示字段的帮助下在此处使用数据库视图。
假设您有一个类型 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]
那么你的结果将是一名员工在某些天工作 0800 到 1600 天,其他天工作 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
我正在创建一个缓慢变化的维度 table 来记录某人何时更改日程以及他们将其更改为什么
这要求我存储星期几及其相关的开始时间和结束时间信息在 table 结构中,其中包含 UserID、星期几、StartTime、EndTime 然后有行每个用户一周中每一天的值。
将其展平并将其存储到 table 中的最佳方法是什么,我可以在其中检索一周中任何一天的开始停止时间。我在想一周中的每一天都有一个开始时间和停止时间的专栏。例如 Monday_Start、Monday_End。一周中的这一天所在的特定日期无关紧要,因为该方面由 rowstartdate 列和 rowenddate 列记录。
我看不出为什么不能在当前指示字段的帮助下在此处使用数据库视图。
假设您有一个类型 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]
那么你的结果将是一名员工在某些天工作 0800 到 1600 天,其他天工作 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