0

当用户没有在 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

这些记录中的所有 3 个错误字段都变为否

样本数据

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

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

样本数据

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

这些记录中的所有 3 个错误字段都变为否

4

1 回答 1

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

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

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

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

于 2012-08-10T00:01:08.767 回答