【问题标题】:SQL Server - Total Hours in monthSQL Server - 每月总小时数
【发布时间】:2017-08-17 11:15:19
【问题描述】:

当我需要计算员工在给定 4 周内的总合同工时时,我遇到了这种情况。员工可能会在期间更改小时数,因此合同总小时数需要根据小时数更改时间进行调整

我的 SQL 是

declare @start datetime = '2017-06-20'
declare @end datetime = '2017-07-20'

select j.EMPLOY_REF, 
j.ACT_HOURS * 4 as ContractedHoursPer4WeekPeriod, 
j.ACT_HOURS as ContractedHoursPerWeek, 
(j.ACT_HOURS / 7) as ContractedHoursPerDay,
j.COSTCENTRE, 
j.FROMDATE, 
j.UNTILDATE 

from jobholdr j

where EMPLOY_REF ='000033504'

结果是

如果此示例中的时间段是从 2017 年 6 月 20 日到 2017 年 7 月 20 日,那么他们应该有 10 天,每周 39 小时,然后是 20 天,每周 30 小时。

如何计算该时间段内的合同总小时数,以得出一个结果,因为该期间内合同工时的差异。我猜它需要通过将其分解为几天来完成,但我不确定下一步该去哪里......

【问题讨论】:

  • 编辑您的问题并显示用于生成结果的数据。
  • 我在您的查询中没有看到 @start@end
  • "我猜这需要通过将其分解为数天来完成" 。好主意。您需要一个整数计数表来枚举 @start@end 之间的天数,并将这一天加入到包含当天每周排列的适当行中。
  • 我的问题确实显示了用于生成显示结果的查询。你还想让我展示什么?
  • 我还没有使用“@start”或“@end”,因为我需要帮助将它们构建到我的示例中的查询中

标签: sql sql-server sql-server-2008


【解决方案1】:

您可以在 SELECT 中包含以下内容

DATEDIFF(day, CASE WHEN @start > j.fromdate 
                   THEN @start 
                   WHEN @start = j.fromdate 
                   THEN j.fromdate 
                   ELSE DATEADD(day,-1,j.fromdate)
               END, 
              CASE WHEN @end > j.untildate 
                   THEN j.untildate 
                   ELSE @end
               END) * (j.act_hours / 7) TotalContractedHours,

【讨论】:

    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 2016-10-02
    • 2022-06-27
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多