更新查询仅在条目存在时更新Holliday条目

时间:2012-08-09 23:34:19

标签: sql-server

我正在尝试编写更新查询,以便在用户未在Holliday上输入H代码时填充时间表中的错误字段

查询需要查看时间表中一周的数据,如果没有找到任何条目,或者找不到条目但是没有代码H.在假日日的多个条目都可以,只要其中1个有H代码。如果没有找到H代码,我需要在时间详细信息中为每周时间详细信息中的错误列添加一个Y

周和帐户将是参数

Table  Time Sheet Fields account hours code date error
Table Hollidays Fields date

这是我需要发生的事情的样本

样本数据

date,code,account,error
8/1/2012    R    12345 null
8/5/2012    R    12345 null
8/9/2012    H    12345 null

所有这三个记录错误字段都变为否

样本数据

date,code,account,error
8/1/2012    R    12345 null
8/5/2012    R    12345 null
8/9/2012    R    12345 null

所有这三个记录错误字段都变为是

样本数据

date,code,account,error
8/1/2012    R    12345 null
8/5/2012    R    12345 null
8/9/2012    H    12345 null
8/9/2012    R    12345 null

所有这三个记录错误字段都变为否

1 个答案:

答案 0 :(得分:1)

我认为这可能是你想要的:

UPDATE ts
set error = 'Y'
FROM timesheet ts
left join holiday h
  on ts.tsdate between DateAdd(Day, -7, h.hdate) 
    and dateadd(d, datediff(d, 0, h.hdate), 0)
WHERE ts.tsdate > DateAdd(Day, -7, getdate())
  AND ts.tsdate <= dateadd(d, datediff(d, 0, getdate()), 0)
  and h.hdate is not null

请参阅SQL Fiddle with Demo

编辑,根据您的评论,我认为您想要这个:

UPDATE ts
set error = CASE when h.hdate Is not null then 'H' ELSE 'R' END
FROM timesheet ts
left join holiday h
  on ts.tsdate between DATEADD(dd, -(DATEPART(dw, h.hdate)-1), h.hdate)
    and DATEADD(dd, 7-(DATEPART(dw, h.hdate)), h.hdate)
WHERE ts.tsdate > DATEADD(dd, -(DATEPART(dw, getdate())-1), getdate())
  AND ts.tsdate <= DATEADD(dd, 7-(DATEPART(dw, getdate())), getdate())

请参阅SQL Fiddle with Demo

第二个版本获取一周的开始/结束(样本是周日至周六),并验证这些日期是否有假期,然后时间表日期也在同一周。如果假日日期不为空,则记录将更新为'H',否则该周的记录将获得'R'