SQL: обнаружение строк, которые пересекают временные границы между двумя датами - PullRequest
0 голосов
/ 29 ноября 2011

Вопрос:

Как определить, какие строки имеют lastModifiedDate <граница при 30 с / мин <утвержденная дата в T-SQL?</p>

Справочная информация:

У нас есть обычный процесс (продукт Autonomy ODBCConnector), который сканирует представление в нашей базе данных и выбирает новостные статьи, которые изменились с момента его последнего запускана основе поля lastModifiedDate.Это происходит каждые тридцать секунд, в минуту и ​​через 30 секунд после минуты.

В этом процессе произошла ошибка, когда одна из операций заключалась в утверждении этих статей, и это не привело к тому, что lastModifiedDateизмените, но измените утвержденную дату.

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

Это всегда будет верно для статей, где approvedDate >= DATEADD(second, 30, lastModifiedDate) - но это не подхватывает все статьи, которые еще нужно поднять.Статья может иметь lastModifiedDate 28/11/2011 15:48:13 и ApprovedDate 28/11/2011 15:48:31 и не может быть получена процессом.

NB, утвержденнаяDate не обязательно более поздняя, ​​чем lastModifiedDate

1 Ответ

1 голос
/ 29 ноября 2011

Вы имеете в виду, что вы хотите, чтобы все записи с утвержденным датой находились в следующем блоке времени 30 с относительно периода 30 с, в котором находится lastModifiedDate?

LastModifiedDate | ApprovedDate | Include In Results?
00:00:00         | 00:00:00     | No
00:00:00         | 00:00:29     | No
00:00:00         | 00:00:30     | Yes
00:00:00         | 00:00:31     | Yes
00:00:00         | 00:01:01     | No?
00:00:29         | 00:00:29     | No
00:00:29         | 00:00:30     | Yes
00:00:29         | 00:00:31     | Yes
00:00:29         | 00:01:01     | No?


Если так, попробуйте это?

WHERE
  DATEDIFF(second, 0, ApprovedDate    ) / 30
  =
  DATEDIFF(second, 0, LastModifiedDate) / 30 + 1


В No? должно быть Yes в исходной таблице, которую я дал, попробуйте это?

WHERE
  DATEDIFF(second, 0, ApprovedDate    ) / 30
  >
  DATEDIFF(second, 0, LastModifiedDate) / 30

Или, может быть ...

WHERE
  ApprovedDate
  >=
  DATEADD(second, 30 - DATEDIFF(second, 0, LastModifiedDate) % 30, lastModifiedDate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...