Проблемы с оператором MSSQL IF

#sql-server #sql-server-2008

#sql-сервер #sql-server-2008

Вопрос:

У меня возникли проблемы с преобразованием запроса из MySQL в MSSQL. Большинство моих ошибок происходят из оператора if, который должен видеть, сколько человеко-часов у нас осталось в данный день. Он проверяет, не работал ли пользователь еще или работает в настоящее время, и добавляет либо количество времени, на которое он запланирован, либо количество времени, которое у него осталось для работы.

 Round(Sum(IF(mon_endtime > Curtime(),IF(mon_starttime > Curtime(),mon_duration, (mon_endtime - Curtime()) / 10000), 0)),1) AS hours
  

Где информация mon_ хранится в таблице employee. Я знаю, что в MSSQL нет curtime(), и у меня есть переменная для ее хранения, но у меня возникают проблемы с получением правильного значения с помощью следующего кода:

 declare @cur_time time;
declare @starttime time;
declare @endtime time;
set @cur_time = CONVERT(time, CURRENT_TIMESTAMP);
select @starttime = tue_starttime from employee;
select @endtime = tue_endtime from employee;
if (@endtime > @cur_time)
begin
    if (@starttime > @cur_time)
    begin
        select sum(tue_duration) as hours from employee
    end
    else begin
        select sum(datediff(hh,@cur_time,tue_endtime)) as hours from employee
    end
end
else begin
    select 0 as hours from employee
    end
  

Любая помощь была бы с благодарностью

Комментарии:

1. Вы не можете использовать IF инструкции в SQL Server подобным образом, используйте CASE вместо этого.

2. Какая версия SQL Server?

3. Я не получаю структуру вашей таблицы и данные. Сколько строк у вас в таблице employee? У вас есть только 1 строка? поскольку у вас есть оператор «select @endtime = tue_endtime from employee», или же у вас одинаковое значение для tue_starttime и tue_endtime во всех строках? Если это да, то ваши таблицы не находятся в нормализованном состоянии.

Ответ №1:

Попробуйте использовать этот CASE оператор вместо:

 ROUND(
    SUM(
        CASE WHEN (mon_endtime > Curtime())
            THEN 
            CASE WHEN (mon_starttime > Curtime())
                THEN mon_duration
                ELSE ((mon_endtime - Curtime()) / 10000)
            END
            ELSE 0
        END)
    ,1) AS Hours
  

(отформатирован, чтобы я мог немного лучше понять инструкцию!)