Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Ограничение за проверка за припокриване на период от време

ПРОВЕРКАТА се изпълняваслед редът е вмъкнат, така че диапазонът се припокрива със самия себе си.

Ще трябва да промените своето WHERE, за да включите нещо като:@MyTableId <> MyTableId .

BTW, вашият израз WHERE може да бъде опростен.

Диапазоните не припокриване, ако:

  • краят на единия диапазон е преди началото на другия
  • или началото на единия диапазон е след края на другия.

Което може да бъде написано на SQL като:

WHERE @DateEnd < DateStart OR DateEnd < @DateStart

Отричайте това, за да получите диапазоните, които правят припокриване...

WHERE NOT (@DateEnd < DateStart OR DateEnd < @DateStart)

...което според законите на Де Морган е същото като...

WHERE NOT (@DateEnd < DateStart) AND NOT (DateEnd < @DateStart)

...което е същото като:

WHERE @DateEnd >= DateStart AND DateEnd >= @DateStart

Така че окончателното ви КЪДЕ трябва да бъде:

WHERE
    @MyTableId <> MyTableId
    AND @DateEnd >= DateStart
    AND DateEnd >= @DateStart

[SQL Fiddle]

ЗАБЕЛЕЖКА:за да позволите на диапазони да се „докосват“, използвайте <= в началния израз, който би произвел > в крайния израз.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да възстановим доверието в ограничение на външния ключ в SQL Server (примери за T-SQL)

  2. Попълване на липсващи дати по групи

  3. Заявката изтече от уеб приложението, но работи добре от студиото за управление

  4. SqlServer:Неуспешно влизане за потребител

  5. Упътване:Настройка на висока наличност на SQL Server