Выберите не в дате SQL - PullRequest
       8

Выберите не в дате SQL

0 голосов
/ 27 апреля 2018

У меня есть следующая таблица:

sDateTime                sItem        sValue
-------------------------------------------
2018-01-01 00:00:00      A            10
2018-01-01 00:00:01      A            15
2018-01-01 00:00:02      A            8
ff.

Данные основаны на second. Что я хочу знать, так это как узнать, есть ли на моем столе «пропущенная» секунда?

Пожалуйста, совет.
Спасибо.

Ответы [ 4 ]

0 голосов
/ 27 апреля 2018

Если вы хотите увидеть все пропущенные секунды, создайте их от минимального до максимального в рекурсивном запросе и удалите из этого набора те, которые есть в вашей таблице.

with seconds(second, last) as
(
  select min(sdatetime), max(sdatetime) from mytable
  union all
  select dateadd(second, 1, second), last from seconds where second < last
)
select second from seconds
except
select sdatetime from mytable
option (maxrecursion 0);

Rextester demo: http://rextester.com/CEL20691

0 голосов
/ 27 апреля 2018

Используя функцию LAG, вы можете сравнить каждую дату с предыдущей и посмотреть, составляет ли разница более 1 секунды.

IF OBJECT_ID('tempdb..#Dates') IS NOT NULL
    DROP TABLE #Dates

CREATE TABLE #Dates (
    sDateTime DATETIME)

INSERT INTO #Dates (
    sDateTime)
VALUES
    ('1908-01-01 00:00:09'),
    ('2018-01-01 00:00:00'),
    ('2018-01-01 00:00:01'),
    ('2018-01-01 00:00:04'),
    ('2018-01-01 00:00:05')

;WITH Lag AS
(
    SELECT
        sDateTime = D.sDateTime,
        PreviousAvailableDateTime = LAG(D.sDateTime, 1, NULL) OVER (ORDER BY D.sDateTime ASC)
    FROM
        #Dates AS D
)
SELECT
    L.sDateTime,
    L.PreviousAvailableDateTime,
    IsThereAGap = CASE WHEN DATEADD(SECOND, 1, L.PreviousAvailableDateTime) <> L.sDateTime THEN 'Yes' END
FROM
    Lag AS L

Результаты:

sDateTime               PreviousAvailableDateTime IsThereAGap
----------------------- ------------------------- -----------
1908-01-01 00:00:09.000 NULL                      NULL
2018-01-01 00:00:00.000 1908-01-01 00:00:09.000   Yes
2018-01-01 00:00:01.000 2018-01-01 00:00:00.000   NULL
2018-01-01 00:00:04.000 2018-01-01 00:00:01.000   Yes
2018-01-01 00:00:05.000 2018-01-01 00:00:04.000   NULL
0 голосов
/ 27 апреля 2018

Как я могу узнать, есть ли на моем столе пропущенная секунда?

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

select case when datediff(second, min(sdatetime), max(sdatetime)) = count(*) - 1
            then 'okay' else 'gaps exist' end as status
from mytable;
0 голосов
/ 27 апреля 2018

Вам понадобится запрос, подобный этому

SELECT * FROM
(SELECT ISNULL(LAG(sDateTime) OVER (ORDER BY sDateTime),sDateTime) as PrevTime,sDateTime,sItem,sValue FROM [yourTable])t
 WHERE DATEDIFF(s,PrevTime,sDateTime)>1

Это даст вам время записи до того, как пропущена секунда, а также детали записи после пропущенной секунды.

...