sql-server-2008 - SQL Server 2008 中带有表达式的嵌入式 CASE

标签 sql-server-2008 t-sql case expression

各位 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/

相关文章:

database - SQL Server 字段被截断

c# - 两个select语句的sql查询

sql - 更新 SQL Server 2012 中的 varbinary(MAX) 字段丢失最后 4 位

sql - AVG 和从一列计数

SQL查询-如何增加员工的工资,不超过一定的工资限制

match - case 和 match 有什么区别?

sql - 多表连接查询的最佳实践

c# - 如何保留数据的旧值和新值?

sql - 顺序不同

sql - 将查询从 MSSQL 转换为 PostgreSQL