#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
(отформатирован, чтобы я мог немного лучше понять инструкцию!)