我一直在参加考勤申请,需要一些启发
这是我当前的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点:(这不是一个很好的解决方案,我知道 如果工作人员在19小时离开,公司时间表为18小时,此更新将原始注销时间更改为减1小时。 我想做的是简化和自动化过程 这带来了我之前的问题......如何根据选择声明进行更新? 或者......换句话说,就像:
UPDATE TimeReport.dbo.Marcacoes
SET Hora = (The value from the statement above, field "teste")
WHERE IdMarcacao = IdMarcacao(from the statement above)
注意:此“IdMarcacao”是该行的唯一标识符
谢谢!
答案 0 :(得分:2)
update TimeReport.dbo.Marcacoes set
Hora = (M.Hora-(convert(varchar(11),dateadd(ms,cast(Extra*3600000 as bigint),'12/30/1899'),108)))
--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))) 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)