SQL Server находит дату между различными строками - PullRequest
1 голос
/ 24 февраля 2011

Я пытаюсь создать запрос, который анализирует данные в нашей системе отслеживания времени. Каждый раз, когда пользователь вводит или выключает удар, он создает строку, записывающую время удара. Таким образом, если вы врезаете в 9:00 и выкладываете в 5:00, есть две строки с этими отметками даты, записанными соответственно. Мне нужен запрос, который будет проходить по строкам с суммой в основном датированных значений между workingpunch_ts (столбец метки времени) в часах.

У каждой строки есть идентификатор, который указывает, является ли удар ударом или ударом (inout_id, 1 для входа, 2 для выхода).

Так, например, если у вас было

ID  | workingpunch_ts         | inout_id
----------------------------------------------
123 | 2011-02-16 09:00:00.000 | 1
124 | 2011-02-16 17:00:00.000 | 2

Это дало бы 8 часов. Теперь мне просто нужно повторить этот процесс для каждой пары строк в таблице.

Мысли о том, как этого добиться?

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

Этот запрос доставит вам проблемы, если люди будут вводить и выключать несколько раз в один и тот же день:

Схема таблицы:

CREATE TABLE [dbo].[TimePunch](
    [TimeCardID] [int] IDENTITY(1,1) NOT NULL,
    [PunchTime] [datetime] NOT NULL,
    [InOrOut] [int] NOT NULL,
    [UserID] [int] NOT NULL,
    [DayofPunch] [datetime] NOT NULL,
 CONSTRAINT [PK_TimePunch] PRIMARY KEY CLUSTERED 
(
    [TimeCardID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 10) ON [PRIMARY]
) ON [PRIMARY]

Запрос:

select 
    tIn.UserID,
    tIn.DayOfPunch,
    DateDiff(Hour, tIn.PunchTime, tOut.PunchTime) as HoursWorked
FROM
    TimePunch tIn,
    TimePunch tOut
WHERE
    tIn.InOrOut = 1
AND tOut.InOrOut = 2
AND tIn.UserID = tOut.UserID
AND tIn.DayofPunch = tOut.DayOfPunch
0 голосов
/ 24 февраля 2011

В часах, конечно

select empid, cast(datediff(d,0,workingpunch_ts) as datetime),
    SUM(case when inout_id = 2 then 1 else -1 end *
    datediff(MI, datediff(d,0,workingpunch_ts), workingpunch_ts))/60.0 as Hours
from clock
where workingpunch_ts between '20110201' and '20110228 23:59:59.999'
group by empid, datediff(d,0,workingpunch_ts)

Пока входы и выходы в паре, вы добавляете все выходы и удаляете все входы, например,

 - IN  (9)
 + OUT (12)
 - IN  (13:15)
 + OUT (17)

Основной коднаходится во 2-й и 3-й строках
datediff-datediff определяет минуты с полуночи для каждого workingpunch_ts, и, если это вычеркивание, оно становится отрицательным с помощью оператора CASE inout_id.

Остальные добавляются для реальных сценариев, в которых нужно группировать по сотруднику и по дню в пределах диапазона дат.

...