【问题标题】:SQL - Finding working days from days workedSQL - 从工作天数中查找工作日
【发布时间】: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


【解决方案1】:

您需要先了解您的月份中每天发生了多少天,
以下查询可以帮助您。

declare @from datetime= '2017/12/01' 
declare @to datetime  = '2018/01/01'

select 
 datediff(day, -7, @to)/7-datediff(day, -6, @from)/7 AS MON,
 datediff(day, -6, @to)/7-datediff(day, -5, @from)/7 AS TUE,
 datediff(day, -5, @to)/7-datediff(day, -4, @from)/7 AS WED,
 datediff(day, -4, @to)/7-datediff(day, -3, @from)/7 AS THU,
 datediff(day, -3, @to)/7-datediff(day, -2, @from)/7 AS FRI,
 datediff(day, -2, @to)/7-datediff(day, -1, @from)/7 AS SAT,
 datediff(day, -1, @to)/7-datediff(day, 0, @from)/7 AS SUN

一旦你有了它,你就可以在你的桌子上数数

【讨论】:

  • 感谢您的帮助。我可能可以将其用于其他数据来计算工作天数
  • 确实是这个想法,我相信你现在会得到它的工作
  • 搞定了。我用它来获取当月的天数,然后如果资源在那天有效,则添加到计数器中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多