UPDATE基于此SELECT - 如何?

时间:2012-01-11 01:18:55

标签: sql sql-server database


我一直在参加考勤申请,需要一些启发 这是我当前的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”是该行的唯一标识符 谢谢!

1 个答案:

答案 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)