Сложный ежедневный автоматический запрос вставки в 2 таблицы - PullRequest
0 голосов
/ 02 сентября 2010

У меня есть следующие таблицы с их столбцами (перечислены только соответствующие столбцы):

запись
EntryID (int / auto-inc)
EmployeeNumber (int)
JustifyDate (datetime)
EntryDate (datetime)

Employee
EmployeeNumber (int)
CoreHourID (int)
WorkingFromHome (бит / bool)

час
EntryID (int)
InHour (datetime)
OutHour (datetime)

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     |
+-----------+-------+-------+----------+

Извините за большой макет, я действительно не знаю, как правильно разместить информацию в таблице. Вот попытка объяснить, что я пытаюсь сделать:

Каждый день необходимо вставлять строки в Entry и Hour для всех сотрудников, которые WorkingFromHome. В таблице Entry должен быть указан соответствующий EmployeeNumber, а для JustifyDate он должен добавить любой день, когда выполняется задание. Для поля EntryDate следует добавить дату этого дня, но часть времени должна быть InHour от первой соответствующей строки CoreHour.

Для таблицы Hour следует добавить EntryID, который только что был вставлен в таблицу Entry, а InHour должен совпадать с EntryDate, а для поля OutHour - добавить DateTime на основе последнего OutHour, соответствующего CoreHourID.

сотрудника

Я изо всех сил, поэтому любая помощь приветствуется.

PS: Любые комментарии / вопросы относительно моего объяснения приветствуются, и я с удовольствием отвечу.

1 Ответ

2 голосов
/ 02 сентября 2010

Следующее может быть включено в хранимую процедуру, которая может быть выполнена с помощью запланированного задания. Я не совсем уверен, что вы имели в виду под 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

(пересмотрен для использования предложения Output).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...