各位 SQL SVR 2008 大师,您好。
作为一个 SQL 新手,我希望得到一些指导。我有一个 SELECT 语句,需要根据每个 worker 的字段值检查表达式,看看他们是否有资格享受带薪午休。他们需要工作的小时数的值位于其 worker 表配置文件中名为“minimumhours”的字段中,我通过针对名为“工作流”的表中的登录和注销字段的表达式来获取他们的工作时间。我拼凑起来的语句如下(开始日期和结束日期将是用户可选择的值):
DECLARE @StartDate AS DateTime
SET @StartDate = CAST('03/25/2012' AS DATE)
DECLARE @EndDate AS DateTime
SET @EndDate = CAST('03/31/2012' AS DATE)
SELECT
w.Firstname
,w.Lastname
,wf.Login
,wf.logout
,ROUND(CAST(DATEDIFF(MI, wf.Login, wf.Logout) AS DECIMAL)/60,2) AS [Hours]
,w.LunchDeduction AS [Lunch Deduction]
CASE [HoursBilled] =
WHEN DATEDIFF(hour, wf.Login, wf.Logout) < wf.MinimumHours THEN
ROUND(CAST(DATEDIFF(MI, wf.Login, wf.Logout) AS DECIMAL)/60,-
w.LunchDeduction,2)
WHEN DATEDIFF(hour, wf.Login, wf.Logout) >= wf.MinimumHours THEN
ROUND(CAST(DATEDIFF(MI, wf.Login, wf.Logout) AS DECIMAL)/60,- 0,2)
END
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
我还没有看到任何似乎符合我的要求的示例,并且希望
最佳答案
我希望这就是您正在寻找的:
DECLARE @StartDate AS DateTime
SET @StartDate = CAST('03/25/2012' AS DATE)
DECLARE @EndDate AS DateTime
SET @EndDate = CAST('03/31/2012' AS DATE)
SELECT
w.Firstname
,w.Lastname
,wf.Login
,wf.logout
,ROUND(CAST(DATEDIFF(MI, wf.Login, wf.Logout) AS DECIMAL)/60,2) AS [Hours]
,w.LunchDeduction AS [Lunch Deduction]
,ROUND(CAST(DATEDIFF(MI, wf.Login, wf.Logout) AS DECIMAL)/60,2)
- CASE
WHEN DATEDIFF(hour, wf.Login, wf.Logout) < wf.MinimumHours THEN
w.LunchDeduction
ELSE
0
END AS [HoursBilled]
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
case语句前少了一个逗号,数学有点奇怪。在我看来,您打算从计费时间中减去 w.LunchDeduction,以防工作人员在他/她的工作中投入的时间少于 wf.MinimumHours,但您却将该信息用作舍入函数的精度参数。
关于sql-server-2008 - SQL Server 2008 中带有表达式的嵌入式 CASE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9960887/