使用时间跨度存储星期几的最佳方式

Posted

技术标签:

【中文标题】使用时间跨度存储星期几的最佳方式【英文标题】:Best Way to store days of the week with Time Spans 【发布时间】:2015-08-17 18:12:36 【问题描述】:

我正在创建一个缓慢变化的维度表来记录某人何时更改计划以及他们将其更改为什么

这要求我存储星期几以及与之关联的开始时间和结束时间,信息在一个由 UserID、星期几、开始时间、结束时间构成的表中,然后有每一天的值行每个用户的一周。

将其展平并将其存储到表中的最佳方法是什么,我可以在其中检索一周中任何一天的开始停止时间。我在想一周中的每一天都有一个开始时间和停止时间的专栏。例如 Monday_Start、Monday_End。一周中的这一天所在的特定日期无关紧要,因为该方面由 rowstartdate 列和 rowenddate 列记录。

【问题讨论】:

这是一个真正的星型维度表,在这种情况下,维度表中的一行代表什么?或者,您是否需要某种形式的规范化表结构? (小问题,您使用的是什么版本的 SQL,例如,您是否有权访问“时间”数据类型?) 所以这是一个由各种较小的表填充的大表,这是星型模式中的真实维度,对吗?此表的目的是保留历史记录,记录发生时间和发生的变化。还有 MS SQL 2012,所以有时间。 【参考方案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]

那么您的结果将是一名员工在某些天工作 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

【讨论】:

以上是关于使用时间跨度存储星期几的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pyspark 2.1 中使用窗口函数来计算星期几的出现次数

oracle中星期几的比较

在java中获取日期的星期几的一个字母缩写

初学python算法100例-案例30 输入星期几的第一个字母判断是星期几

求某段时间内星期几的天数

基于星期几的日期的去年等价物