【发布时间】:2018-03-20 20:57:18
【问题描述】:
我们有一个表格,其中包含资源及其工作天数。例如,一个人可以在周一至周五工作,但另一个人该周只能工作两天。 这是数据:
WorkOnSunday WorkOnMonday WorkOnTuesday WorkOnWednesday WorkOnThursday WorkOnFriday WorkOnSaturday
--------------------------------------------------------------------------------------------------------------
0 1 1 1 1 1 0
0 0 1 1 0 0 0
(对于缺少格式表示歉意,但屏幕截图不会通过我们该死的代理上传。)
所以问题是,我如何使用上面的数据获得一个月的工作天数? (假期是下一个阶段。我正试图抓住我们显然拥有的假期表)
这是我目前所拥有的:
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate = '2017/12/01'
SET @EndDate = '2018/01/01'
SELECT
(DATEDIFF(dd, @StartDate, @EndDate))
-(DATEDIFF(wk, @StartDate, @EndDate) * 2)
-(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
这给了我一个月中正确的工作日数量
【问题讨论】:
-
这可能与规范化有关。有一个包含以下字段的子表:“资源 ID”、“DayOfWeek”、“Works”(其中 Works 是布尔 0/1 字段,“DayofWeek”是表示星期几的数字。主键是资源 ID 和星期几的组合。这样可以更轻松地编写与此数据相关的有用查询。您可能还需要使用其他内容对其进行细化,例如开始/结束日期,以便您了解工作中的变化随着时间的推移模式。你现在得到的东西是不灵活的,不会让你得到你需要的信息,无论如何都不容易
-
您的第一个表格中似乎缺少重要信息——特别是资源 ID 和 WeekStarting 或 Ending 日期。你也有这些信息吗?
-
发布正确的表结构
-
是的,我有资源 ID 等,但我会按资源逐月运行此命令。 IE。 12 月等月份的 ResourceID 1。
-
你也有周ID栏。表结构肯定会让它变得非常简单。
标签: sql sql-server date dayofweek