Расчет фреймов с помощью временного кода SQL - PullRequest
0 голосов
/ 05 апреля 2019

Итак, у меня есть таблица SQL, как показано ниже

+---------+-------------+-------------+------------------+-----------------+
| Barcode |    Time1    |    Time2    | Frame for time 1 | Frame for time2 |
+---------+-------------+-------------+------------------+-----------------+
|       1 | 10:20:34.25 | 23:59:59.25 | NULL             | NULL            |
|         |             |             |                  |                 |
+---------+-------------+-------------+------------------+-----------------+

Мне нужен способ расчета фреймов для времени1 и времени2, как на следующем веб-сайте http://www.zapstudio.net/framecalc/, чтобы создать таблицу ниже

+---------+-------------+-------------+------------------+-----------------+
| Barcode |    Time1    |    Time2    | Frame for time 1 | Frame for time2 |
+---------+-------------+-------------+------------------+-----------------+
|       1 | 10:20:34.25 | 23:59:59.25 | 930880           | 2160000         |
|         |             |             |                  |                 |
+---------+-------------+-------------+------------------+-----------------+

Однако во время вычисления кадров я хочу, чтобы частота кадров для каждого штрих-кода читалась из другой таблицы, которая равна

+---------+--------+------------+
| Barcode | Format | Frame Rate |
+---------+--------+------------+
|       1 | 1080p  |         25 |
+---------+--------+------------+

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Математическая формула будет выглядеть так: ([часы] * 3600 + [минуты] * 60 + [секунды]) * [frame_rate] + [милисекунды]

Это код, который обновляет вашу таблицу:

CREATE TABLE #FramesConfig
    (
        Barcode int,
        Format varchar(8),
        FrameRate int
    )

CREATE TABLE #Frames
(
    Barcode int,
    Time1 time(2),
    Time2 time(2),
    FrameForTime1 int,
    FrameForTime2 int
)

INSERT INTO #FramesConfig
VALUES(1, '1080p', 25)

INSERT INTO #Frames
VALUES (1, '10:20:34.25', '23:59:59.25', NULL, NULL)

UPDATE f
SET FrameForTime1 = DATEDIFF(SS, 0, f.Time1) * fc.FrameRate + RIGHT(f.Time1, 2),
FrameForTime2 = DATEDIFF(SS, 0, f.Time2) * fc.FrameRate + RIGHT(f.Time2, 2)
FROM #Frames f
    INNER JOIN #FramesConfig fc ON f.Barcode = fc.Barcode


SELECT *
FROM #Frames

DROP TABLE #Frames
DROP TABLE #FramesConfig
1 голос
/ 05 апреля 2019

Это простой расчет, как только вы поймете, что частота кадров - это просто количество кадров в секунду.Вам просто нужно преобразовать время в секунды и добавить значение после того, что казалось десятичной точкой, но это просто дополнительные кадры.В следующем расчете используется неявное преобразование во время, но оно ограничено 23:59:59.Если вам нужно большее значение, можно установить более сложное преобразование.Он также не учитывает неправильный формат.

CREATE TABLE #Barcodes(
    Barcode         int,
    Time1           varchar(11),
    Time2           varchar(11),
    FramesForTime1  int,
    FramesForTime2  int
)
INSERT INTO #Barcodes(Barcode, Time1, Time2)
VALUES( 1, '10:20:34.25', '23:59:59.25')
CREATE TABLE #FrameRates(
    Barcode         int,
    Format          varchar(11),
    FrameRate       int
)
INSERT INTO #FrameRates VALUES( 1, '1080p', 25);

SELECT bc.Barcode, 
    bc.Time1,
    bc.Time2,
    DATEDIFF( ss, 0, LEFT( Time1, 8)) * Fr.FrameRate + RIGHT(Time1, 2) AS FramesForTime1, 
    DATEDIFF( ss, 0, LEFT( Time2, 8)) * Fr.FrameRate + RIGHT(Time2, 2) AS FramesForTime2,
    fr.Format,
    fr.FrameRate
FROM #Barcodes bc
JOIN #FrameRates fr ON bc.Barcode = fr.Barcode

GO
DROP TABLE #Barcodes, #FrameRates

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

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