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

#sql #sql-server #datetime #datediff #ssms-2014

#sql #sql-сервер #datetime #datediff #ssms-2014

Вопрос:

У меня это не совсем работает!

Мой запрос выглядит следующим образом:

 SELECT COUNT (*) as [generic] 
FROM [Log]
Where value IN (Select ID, tsSendDocument, sysReceivedFrom
WHERE sysReceivedFrom = 'generic' AND 
DATEDIFF(hour, tsSendDocument, GetDate()) > 2) 
  

Итак, что я здесь делаю не так?

Я хочу, чтобы он подсчитывал каждый раз, когда столбец tsSendDocument старше 2 часов. В конечном итоге это даст мне счетчик, равный 1. У меня настроена таблица, которая будет предупреждать меня, если значение = 1, что означает, что tsSendDocument старше 2 часов.

Имеет ли это какой-либо смысл?

Комментарии:

1. Предоставьте образцы данных и желаемые результаты.

2. Вы упоминаете что-то в комментариях о том, что хотите только самую последнюю. Не уверен, что вы это имеете в виду. Нам нужны образцы данных и желаемый результат вместе с полным объяснением бизнес-правил.

3. Итак, хорошо. У меня есть небольшой бизнес, где я получаю документы, конвертирую их в определенный формат и отправляю получателю. Я хочу убедиться, что существует постоянный поток отправляемых документов, таким образом, убедиться, что всегда есть отправленный документ моложе двух часов. Если последний отправленный мной документ старше двух часов, это может означать, что с моим сервисом что-то не так. Затем я хочу выполнить запрос select count. Если последний документ старше нескольких часов, результат подсчета будет равен 1. Если значение моложе, то оно равно 0. Вот почему я хочу, чтобы он учитывал только последнюю запись в таблице.

Ответ №1:

Согласно вашему комментарию, я понял, что вы хотите проверить, старше ли последняя запись 2 часов, так что это должно сработать:

 SELECT TOP 1 CASE WHEN tsSendDocument < DATEADD(HOUR, -2, GETDATE()) THEN 1 ELSE 0 END AS [generic]
FROM [Log]
ORDER BY tsSendDocument DESC
  

Комментарии:

1. Да! Большое вам спасибо! Извините за расплывчатое описание, в данный момент я медленно изучаю SQL.

Ответ №2:

Я думаю, вам нужна только агрегация :

 Select COUNT(*) 
FROM Log
WHERE sysReceivedFrom = 'generic' AND 
      DATEDIFF(hour, tsSendDocument, GetDate()) > = 2;
  

subquery вернет только одно выражение, когда вы указали предложение IN or NOT IN .

Комментарии:

1. Но проблема в том, что я хочу, чтобы он учитывал только самую новую запись. В противном случае, в настоящее время он будет учитывать всю таблицу, которая будет содержать много записей старше двух часов. Это должна быть исключительно самая новая запись, чтобы результат подсчета был равен 1, если самая новая запись старше 2 часов.

2. Это выглядит довольно хорошо, но будьте осторожны, используя DATEDIFF здесь. Он рассматривает только превышаемые пороговые значения даты. Таким образом, это может возвращать строки с интервалом чуть более одного часа. Это также невозможно исправить. Возможно, было бы точнее использовать «Где tsSendDocument < dateadd(hour, -2, getdate())». Это было бы более точным и приемлемым. 🙂

3. Спасибо, Шон. Как мне тогда ограничить его верхней строкой? Есть идея?