Я работал в приложении учета рабочего времени, и мне нужно немного просвещения.
Это мой текущий запрос SQL:
SELECT M.IdMarcacao, M.IdFuncionario, M.Data, M.Hora, Extra,
(M.Hora-(convert(varchar(11),dateadd(ms,cast(Extra*3600000 as bigint),'12/30/1899'),108))) as teste
FROM TimeReport.dbo.Marcacoes M
INNER JOIN TimeReport.dbo.Resultados R ON M.IdFuncionario = R.IdFuncionario
AND M.Data = R.Data
WHERE (R.Extra <> 0 AND M.[Tipo Marcacao] = 'SAI')
AND M.Hora=(SELECT max(hora)
FROM timereport.dbo.marcacoes
WHERE data = M.Data)
Это возвращает строки, где:
1 - человек совершил сверхурочные часы.
2 - время последнего выхода из системы
3 - общее количество часов сверхурочной работы.
4 - разница между временем выхода из системы и сверхурочной работой = время по расписанию
5- Убедитесь, что это время выхода из системы (Tipo = SAI)
Не вдаваясь в подробности о самом приложении, мне действительно нужно превратить это в оператор UPDATE
.
Я использовал для этого:
UPDATE [TimeReport].[dbo].[Marcacoes]
SET [Hora] = [Hora] - convert(datetime,'01:00:00',108)
WHERE [Hora] > '1899-12-30 19:00:00.000'
За каждый час до 0 вечера :( Я знаю, что это плохое решение.
Это обновление изменит исходное время выхода из системы на минус 1 час, если работник ушел в 19 часов,когда график работы компании составляет 18 часов.
То, что я пытаюсь сделать, - это упростить и автоматизировать процесс.
В связи с этим возникает мой предыдущий вопрос ... Как я могу сделать обновление на основе этого оператора select?
Или ... другими словами, снапример:
UPDATE TimeReport.dbo.Marcacoes
SET Hora = (The value from the statement above, field "teste")
WHERE IdMarcacao = IdMarcacao(from the statement above)
Примечание. Этот «IdMarcacao» является уникальным идентификатором строки.
Спасибо!