Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проверка записи данных за определенный интервал времени  [new]
85sergu
Member

Откуда: Винница
Сообщений: 137
День добрый!
Есть таблица Archiv_1M, в которой есть поле dtMod - содержащее время. В данную таблицу каждую минуту пишутся данные.
Я хотел реализовать проверку записи данных. Задаю начальное и конечное время проверки (@DateBegin, @DateEnd) и хочу увидеть время за которое нет информации.
Скрипт показывает время которое есть в базе.
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
DECLARE @DateBegin DATETIME
DECLARE @DateEnd DATETIME

SET @ParmDefinition = N'@Date1 DATETIME, @Date2 DATETIME';
SET @DateBegin = '22.01.2015 8:00:00'
SET @DateEnd =   '22.01.2015 8:05:00'

SET @SQLString = N'SELECT dtMod FROM [oik].[dbo].[Archiv_1M] WHERE dtMod>=@Date1 AND dtMod<=@Date2 GROUP BY dtMod';
EXECUTE sp_executesql @SQLString, @ParmDefinition, @Date1=@DateBegin, @Date2=@DateEnd 

Результат выполнения скрипта
Результат
2015-01-22 08:00:00.000
2015-01-22 08:01:00.000
2015-01-22 08:02:00.000
2015-01-22 08:04:00.000
2015-01-22 08:05:00.000

Как модернизировать скрипт что бы он показал время которого нет в базе.
Результат
2015-01-22 08:03:00.000
22 янв 15, 10:49    [17152697]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
Glory
Member

Откуда:
Сообщений: 104751
85sergu
Как модернизировать скрипт что бы он показал время которого нет в базе.

Иметь таблицу, где есть все нужные данные. В данном случае - минуты
22 янв 15, 10:51    [17152719]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
85sergu
Member

Откуда: Винница
Сообщений: 137
Glory
Иметь таблицу, где есть все нужные данные. В данном случае - минуты

это вариант. Но хотелось реализовать красиво, в виде скрипта, не ссылаясь на сторонние таблицы.
22 янв 15, 11:06    [17152784]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
Glory
Member

Откуда:
Сообщений: 104751
85sergu
это вариант. Но хотелось реализовать красиво, в виде скрипта, не ссылаясь на сторонние таблицы.

Ну так реализуйте _создание_ всех нужных записей в скрипте - кто же мешает
Смысл то от этого не меняется
22 янв 15, 11:08    [17152792]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
85sergu
Glory
Иметь таблицу, где есть все нужные данные. В данном случае - минуты

это вариант. Но хотелось реализовать красиво, в виде скрипта, не ссылаясь на сторонние таблицы.
Красиво - это как раз с использованием таблицы натуральных чисел, например.
К тому же, понятие красоты у всех разное.
У сервера, например, - это оптимальное по времени выполнение запроса.
А это как раз случай отдельной заранее заполненной таблицы.
22 янв 15, 11:16    [17152847]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
85sergu
Member

Откуда: Винница
Сообщений: 137
Glory
Ну так реализуйте _создание_ всех нужных записей в скрипте - кто же мешает
Смысл то от этого не меняется

Данные в таблицу поступают сторонней программой. И бывают случаи (сбой, проблемы с сетью, и т.д.) когда дынные не поступают в таблицу. Я хочу скриптом увидеть время за которое нет информации.
22 янв 15, 11:20    [17152868]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
Glory
Member

Откуда:
Сообщений: 104751
85sergu
Я хочу скриптом увидеть время за которое нет информации.

Зачем повторять еще раз первое сообщение ?
22 янв 15, 11:22    [17152882]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
85sergu
Glory
Ну так реализуйте _создание_ всех нужных записей в скрипте - кто же мешает
Смысл то от этого не меняется

Данные в таблицу поступают сторонней программой. И бывают случаи (сбой, проблемы с сетью, и т.д.) когда дынные не поступают в таблицу. Я хочу скриптом увидеть время за которое нет информации.
Так создайте же, наконец, таблицу всех возможных минут!
Их всего-то 60.
После этого LEFT JOIN с ней таблицы Ваших данных. И всё!
22 янв 15, 11:23    [17152890]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
85sergu
пропущено...

Данные в таблицу поступают сторонней программой. И бывают случаи (сбой, проблемы с сетью, и т.д.) когда дынные не поступают в таблицу. Я хочу скриптом увидеть время за которое нет информации.
Так создайте же, наконец, таблицу всех возможных минут!
Их всего-то 60.
После этого LEFT JOIN с ней таблицы Ваших данных. И всё!
Хотя, наверно, и часы могут быть пропущены?
Можно хранить все часы с минутами за сутки. 24*60=1440 строк
22 янв 15, 11:32    [17152950]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
LAG OVER
Guest
вычислите лагом предыдущую датувремя и сравнивайте с текущей.
22 янв 15, 11:44    [17153055]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
LAG OVER
вычислите лагом предыдущую датувремя и сравнивайте с текущей.
Как же это поможет получить строки, отсутствующие в таблице?
22 янв 15, 11:46    [17153068]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
LAG OVER
Guest
iap, Потом обработать напильником:

DECLARE @tblTMP TABLE (test datetime2)
INSERT INTO @tblTMP VALUES ('20150122 08:00:00.000')
INSERT INTO @tblTMP VALUES ('20150122 08:01:00.000')
INSERT INTO @tblTMP VALUES ('20150122 08:02:00.000')
INSERT INTO @tblTMP VALUES ('20150122 08:04:00.000')
INSERT INTO @tblTMP VALUES ('20150122 08:05:00.000')
INSERT INTO @tblTMP VALUES ('20150122 09:10:00.000')


;WITH cte AS
(
SELECT test, lg, df
FROM
(
SELECT test, LAG(test) OVER (ORDER BY test) lg, DATEDIFF(mi, LAG(test) OVER (ORDER BY test), test) df
FROM @tblTMP
) x
WHERE df > 1
UNION ALL
SELECT test, DATEADD(mi, 1, lg) lg, 0
FROM cte
WHERE DATEADD(mi, 1, lg) < test
)
SELECT lg FROM cte WHERE df = 0 ORDER BY lg
22 янв 15, 12:06    [17153201]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
Glory
Member

Откуда:
Сообщений: 104751
LAG OVER
Потом обработать напильником:

Извините, а зачем тут тогда LAG, если ту же рекурсию можно сразу создать для заданного в переменных промежутка времени ?
22 янв 15, 12:10    [17153234]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
LAG OVER
Guest
Glory,

Я недочитал условие(.
автор
Я хотел реализовать проверку записи данных
Вот это и реализовывал лагом.
22 янв 15, 12:14    [17153264]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
DECLARE @DateBegin DATETIME
DECLARE @DateEnd DATETIME

SET @DateBegin = '2015-01-22 8:00:00'
SET @DateEnd =   '2015-01-22 8:05:00'

declare @Archiv_1M  table(id int not null primary key identity(1,1),[dtMod] datetime) 
insert into @Archiv_1M ([dtMod]) 
values('2015-01-22 8:00:10')
,('2015-01-22 8:00:20')
,('2015-01-22 8:01:20')
,('2015-01-22 8:04:15')
,('2015-01-22 8:04:30')

select GETDATE()
;with Period(DateB,DateE) as
(select @DateBegin,@DateEnd
 union all
 select DATEADD(mi,1,DateB),DateE
 from Period
 where DateB < DateE
)select p.DateB,COUNT(a.[dtMod]) 
from Period p
left join @Archiv_1M a on a.[dtMod] between p.DateB and DATEADD(mi,1,p.DateB)
group by p.DateB
22 янв 15, 12:26    [17153351]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
LexusR,

Но согласитесь, использовать таблицу проще, эффективнее и понятнее!
К тому же она постоянно бывает полезна для десятков других задач.
22 янв 15, 12:29    [17153369]     Ответить | Цитировать Сообщить модератору
 Re: Проверка записи данных за определенный интервал времени  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
iap
LexusR,

Но согласитесь, использовать таблицу проще, эффективнее и понятнее!
К тому же она постоянно бывает полезна для десятков других задач.

100500 :)
22 янв 15, 12:33    [17153400]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить