Должен ли я использовать триггер TSQL для добавления записей во вставку? - PullRequest
0 голосов
/ 23 октября 2018

Мы регистрируем данные об использовании инструментов на фабрике путем очистки их файлов журнала.Все они имеют свои собственные форматы, но, вообще говоря, все инструменты генерируют данные, которые можно легко преобразовать в это:

MachineID    StartTime             DurationSeconds  Operaton
1            2018-10-22 01:30:00   60               Drill
1            2018-10-22 01:31:00   60               Drill
1            2018-10-22 01:59:59   7202             Drill

Наличие нескольких записей в пределах часовой границы - это нормально.

Данные в этомФорма делает аналитику громоздкой, потому что нам нужно представлять данные в группах по одному часу (например, в группе по StartTime, округленной до часа, чтобы сообщить о почасовом использовании).Это невозможно с неограниченной продолжительностью.Наш текущий код (в .net) отображает вышеупомянутую запись файла журнала в базу данных следующим образом:

MachineID    StartTime             DurationSeconds  Operaton
1            2018-10-22 01:30:00   60               Drill
1            2018-10-22 01:31:00   60               Drill
1            2018-10-22 01:59:59   1                Drill
1            2018-10-22 02:00:00   3600             Drill
1            2018-10-22 03:00:00   3600             Drill
1            2018-10-22 04:00:00   1                Drill

Это было немного сложно сделать правильно в нашей текущей системе, и я бы предпочел не указывать это дляпродавцы и гадость со всеми, понимающими это правильно.Если бы они просто записали свои «сырые» данные начала / продолжительности, это было бы проще для всех.

Как я могу использовать триггер для преобразования общих данных журнала (начало / длительность) в желаемые фрагментированные данные?Похоже, что триггер может перебирать DurationSeconds и данные чанка в триггере.

В качестве альтернативы, я думаю, они могли бы записывать необработанные данные в таблицу, а я мог читать данные и записывать фрагментированные данные в другую таблицу.

Триггер выглядит как более чистое решение.

1 Ответ

0 голосов
/ 25 октября 2018

Я пошел с хранимой процедурой:

</p> <pre><code>ALTER PROCEDURE [dbo].[AddEquipmentUtilization] @id_equip INT, @start_time DateTime, @job_seconds INT AS BEGIN SET NOCOUNT ON; declare @min int; declare @sec int ; declare @sec_in_hour int; declare @sec_to_add int; --Write chunks of data to the table in pieces upto the #of seconds left in the hour WHILE @job_seconds > 0 begin -- Number of seconds left in current hour (partial hour OK) set @min = DATEPART(minute,@start_time); set @sec = DATEPART(second,@start_time); set @sec_in_hour = (59-@min)*60 + 60-@sec -- Add everything left in hour or the full hour if @job_seconds < @sec_in_hour set @sec_to_add = @job_seconds else set @sec_to_add = @sec_in_hour insert into Test (StartTime,Seconds,Id) Values (@start_time,@sec_to_add,@id_equip) -- Invariant: add/subtract sec_to_add set @start_time = DateAdd(second,@sec_to_add,@start_time) set @job_seconds= @job_seconds-@sec_to_add end END

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