【发布时间】:2012-04-02 18:34:48
【问题描述】:
再次问候 SQL Server 2008 大师。
我需要在SELECT 语句中将以下规则应用于设置工人工作日(小时工)的开始和结束时间。我提前为我对 SQL 的无知表示歉意。
-
规则是将他们的开始时间设置为存储在该工作人员的表字段中的值,如果他们在开始时间或之前登录(存储在工作人员
starttime列中的时间)并因此获得启动的信用在他们的开始时间。如果他们在结束时间之前或之后的 10 分钟内注销,则存储在工人的列中,他们将获得全天的信用,另一个值存储在工人表的列中,否则将受到处罚一个小时的某个百分比,即他们的注销时间四舍五入到最接近他们注销时间的 0.25 小时。即,如果他们设置为在 4:30 注销,并且他们在 4:18 注销,则他们的注销时间为 4:15。如果他们在 4:20 注销,并设置在 4:30 注销,则他们的注销时间为 4:30。
-
第一条规则适用于其工作日时间少于或等于其预期工作日值的所有小时工。需要注意的是,对于那些可以加班的人(位值设置为 1)。如果允许加班,计费小时数可能会超过为他们存储的全天值,因此他们的注销 - 登录时间值可能会超过其全天值。
问题是,这些规则是否可以在 SELECT 语句中计算出来,如果可以,我可以得到一些代码方面的帮助吗?
包含信息的列是:
worker.startime (TIME)
worker.endtime (TIME)
worker.overtimeallowed (BIT)
worker.workdayhours (decimal (12,2))
worker.penaltyvalue (decimal (12,2))
如果它需要 UDF 或存储过程(因为我使用的是 Telerik ReportViewer),我不确定它是否会被支持,但这可能是另一个问题。
到目前为止,我在应用一些 CASE 逻辑方面获得了一些帮助 - 计算工人是否获得了 1/2 午餐的功劳。提供的代码按承诺工作。我相信这可能是对该逻辑的扩展 - 所以我将在此处提供我的代码:
-- for testing purposes only.
DECLARE @StartDate AS DateTime
SET @StartDate = CAST('03/25/2012' AS DATE)
DECLARE @EndDate AS DateTime
SET @EndDate = CAST('04/10/2012' AS DATE)
SELECT
w.Firstname
,w.Lastname
,wf.Login
,wf.logout
,ROUND(CAST(DATEDIFF(MI, wf.Login, wf.Logout) AS DECIMAL)/60,2)
- CASE
WHEN DATEDIFF(hour, wf.Login, wf.Logout) < w.MinimumHours THEN
w.LunchDeduction
ELSE
0
END AS [Hours Credited]
FROM Workers AS w
JOIN Workflow AS wf
ON wf.LoggedInWorkerid = w.ID
JOIN Roles AS r
ON w.RoleID = r.RoleID
WHERE (r.Descript = 'Hourly')
AND wf.Login >= @StartDate AND wf.Logout <= @EndDate
ORDER BY w.Lastname, w.Firstname
【问题讨论】:
-
是的,听起来这一切都可以在查询中完成。像大多数问题一样,尝试将其分解。剪切并粘贴您现有的
CASE并对其进行修改以检查“10 分钟”规则并输出一个标志。然后继续一次添加一层。你很快就会得到它。 -
在大多数司法管辖区,如果员工提早打卡,即使加班未获批准,您也必须支付他们的时间。他们工作,他们得到报酬。时期。是的,这是一个问题,但不是你通过扣留工资来处理的问题。 HR 与经理讨论设定期望,经理与员工讨论他们何时出现和打卡;如果仍然没有达到预期,管理层就会开始使用纪律程序来强制执行。但如果他们打卡上班,他们就会得到报酬。
标签: sql-server-2008 case field