Встроенный CASE с выражениями в SQL Server 2008 - PullRequest
2 голосов
/ 01 апреля 2012

Привет SQL SVR 2008 гуру.

Как новичок в SQL, я надеюсь на какое-то направление. У меня есть оператор SELECT, который должен проверить выражение по значению поля для каждого работника, чтобы увидеть, имеют ли они право на оплачиваемый обеденный перерыв. Значение количества часов, которое им нужно для работы, находится в профиле их рабочей таблицы в поле под названием минимальное время, и я вычисляю их часы из выражения для поля входа и выхода в таблице, называемой рабочим процессом. Утверждение, которое я собрал, выглядит следующим образом (начальная и конечная даты будут выбираемыми пользователем значениями):

    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 

Я не видел ни одного примера, который бы соответствовал моим требованиям, и надеялся

1 Ответ

2 голосов
/ 01 апреля 2012

Я надеюсь, что это то, что вы ищете:

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 из часов, выставленных на тот случай, если работник вложил в задание hi / hers меньше, чем wf.MinimumHours, но вместо этого вы использовали эту информацию в качестве параметра точности для округления функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...