2个表中复杂的每日自动插入查询

时间:2010-09-02 16:57:54

标签: sql sql-server sql-server-2005 tsql

我的列有以下表格(仅列出相关列):

  

条目
  EntryID(int / auto-inc)
  EmployeeNumber(int)
  JustifyDate(datetime)
  EntryDate(日期时间)

     

员工
  EmployeeNumber(int)
  CoreHourID(int)
  WorkingFromHome(bit / bool)

     

小时
  EntryID(int)
  InHour(日期时间)
  OutHour(日期时间)

     

CoreHour
  CoreHourID(int) - 不是唯一的   InHour(int)
  OutHour(int)

编辑:我忘了提到CoreHourID不是一个独特的字段,表格看起来像这样:

+-----------+-------+-------+----------+
|CoreHourId |InHour |OutHour|Identifier|
+-----------+-------+-------+----------+
|    2      |  9    |  12   |    1     |
|    2      |  14   |  17   |    2     |
|    3      |  7    |  11   |    3     |
|    3      |  15   |  18   |    4     |
+-----------+-------+-------+----------+

抱歉大布局,我真的不知道如何正确发布表信息。 现在,这是尝试解释我正在尝试做的事情:

每天都应在EntryHour中为所有WorkingFromHome的员工插入一行。在Entry表中,它应该放置相应的EmployeeNumber,对于JustifyDate,它应该添加作业运行时的任何一天。对于EntryDate字段,它应该添加当天的日期,但时间部分应该是第一个对应的InHour行中的CoreHour

对于Hour表,它应该添加刚插入EntryID表中的EntryInHour应该与EntryDate相同}对于OutHour字段,它应根据与员工OutHour对应的最后CoreHourID添加日期时间。

我很挣扎,所以感谢任何帮助。

PS:欢迎任何有关我的解释的意见/问题,我很乐意回复。

1 个答案:

答案 0 :(得分:2)

以下内容可以封装到可以通过预定作业执行的存储过程中。我不确定for JustifyDate it should add whatever day it is when the job is running你的意思。

Declare @NewEntries Table (
                            EntryId int not null
                            , EmployeeNumber int not null
                            , JustifyDate datetime
                            , EntryDate datetime
                            )

Insert [Entry]( EmployeeNumber, JustifyDate, EntryDate )
    Output Inserted.EntryId, Inserted.EmployeeNumber, Inserted.JustifyDate, Inserted.EntryDate 
        Into @NewEntries
Select EmployeeNumber
    , CURRENT_TIMESTAMP
    , DateAdd(hh, CoreHour.InHour, DateAdd(d, 0, CURRENT_TIMESTAMP))
From Employee
    Join CoreHour
        On CoreHour.CoreHourId = Employee.CoreHourId
Where WorkingFromHome = 1

Insert [Hour]( EntryId, InHour, OutHour )
Select NE.EntryId, DatePart(hh, NE.EntryDate), CoreHour.OutHour
From @NewEntries As NE
    Join Employee
        On Employee.EmployeeNumber = NE.EmployeeNumber
    Join CoreHour
        On CoreHour.CoreHourId = Employee.CoreHourId

(修改为使用输出子句)。