Sql server 2008 SQL Server 2008中带表达式的嵌入式CASE

Sql server 2008 SQL Server 2008中带表达式的嵌入式CASE,sql-server-2008,tsql,case,expression,Sql Server 2008,Tsql,Case,Expression,大家好,SQL SVR 2008大师 作为一个SQL新手,我希望有一些方向。我有一个SELECT语句,需要为每个员工检查一个表达式和一个字段值,看看他们是否有资格享受带薪午休。他们需要工作的小时数的值在名为minimumhours的workers表配置文件中,我从名为workflow的表中的login and logout字段的表达式中获取他们的工作小时数。我拼凑的语句如下(startdate和enddate将是用户可选择的值): 将@StartDate声明为DateTime SET@Start

大家好,SQL SVR 2008大师

作为一个SQL新手,我希望有一些方向。我有一个SELECT语句,需要为每个员工检查一个表达式和一个字段值,看看他们是否有资格享受带薪午休。他们需要工作的小时数的值在名为minimumhours的workers表配置文件中,我从名为workflow的表中的login and logout字段的表达式中获取他们的工作小时数。我拼凑的语句如下(startdate和enddate将是用户可选择的值):

将@StartDate声明为DateTime
SET@StartDate=CAST(2012年3月25日为日期)
将@EndDate声明为DateTime
设置@EndDate=CAST('03/31/2012'为日期)
挑选
w、 名字
,w.Lastname
,wf.Login
,wf.logout
,四舍五入(日期差(MI,wf.Login,wf.Logout)为十进制)/60,2)为[小时]
,w.午餐扣除额为[午餐扣除额]
案例[小时计费]=
当DATEDIFF(小时,wf.Login,wf.Logout)=wf.MinimumHours时
四舍五入(转换为十进制的日期差(MI、wf.Login、wf.Logout)/60,-0,2)
结束
从工人到工人
以wf身份加入工作流
在wf.LoggedInWorkerid=w.ID上
以r的身份加入角色
关于w.RoleID=r.RoleID
其中(r.Descript=‘每小时’)

和wf.Login>=@StartDate和wf.Logout我希望这就是您正在寻找的:

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 
将@StartDate声明为DateTime
SET@StartDate=CAST(2012年3月25日为日期)
将@EndDate声明为DateTime
设置@EndDate=CAST('03/31/2012'为日期)
挑选
w、 名字
,w.Lastname
,wf.Login
,wf.logout
,四舍五入(日期差(MI,wf.Login,wf.Logout)为十进制)/60,2)为[小时]
,w.午餐扣除额为[午餐扣除额]
,四舍五入(转换为十进制的日期差(MI、wf.Login、wf.Logout)/60,2)
-案例
当DATEDIFF(小时,wf.Login,wf.Logout)和wf.Login>=@StartDate和wf.Logout您有什么问题?谢谢Nikola。这很好,现在可以更清楚地看到CASE语句的语法。我将发布另一个相关问题,这与四舍五入有关。这里的首席执行官希望应用一些具体的四舍五入规则。再次感谢你,也许你可以帮我写下一篇文章:)作为这个问题的补充,如果w.nextraction为0,有没有办法输出一个字段?不客气。至于另外一个问题,我不明白。如果您的意思是如果您只能在特定条件下返回一列,那么不,您不能。列在选择列表中是固定的;您只能更改值,PIVOT和UNPIVOT查询除外。你好,Nikola。我正在看你关于这个问题的帖子(这显然是进化的)。看起来很棒。我正在测试它,并将在那里留下评论。又是Thx。
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