Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Ograniczenie sprawdzania nakładania się zakresu dat

KONTROLA jest wykonywana po wiersz został wstawiony, więc zakres nakłada się na siebie.

Musisz zmienić WHERE tak, aby zawierał coś takiego:@MyTableId <> MyTableId .

BTW, twoje wyrażenie WHERE można uprościć.

Zakresy nie nakładają się, jeśli:

  • koniec jednego zakresu jest przed początkiem drugiego
  • lub początek jednego zakresu następuje po końcu drugiego.

Które można napisać w SQL, tak jak:

WHERE @DateEnd < DateStart OR DateEnd < @DateStart

Odrzuć to, aby uzyskać zakresy, które wykonują nakładają się...

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

...co zgodnie z prawami De Morgana jest tym samym, co...

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

...czyli to samo co:

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

Więc twoje ostateczne GDZIE powinno być:

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

[Skrzypce SQL]

UWAGA:aby zezwolić zakresom na „dotyk”, użyj <= w wyrażeniu początkowym, co spowoduje powstanie > w ostatecznym wyrażeniu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Utwórz bazę danych SQL Server za pomocą Azure Data Studio

  2. Czy można używać wyszukiwania pełnotekstowego (FTS) z LINQ?

  3. Ważna zmiana w Extended Events w SQL Server 2012

  4. Jak używać Sum, Avg i Count w instrukcji Select — samouczek SQL Server / TSQL, część 128

  5. Jaka jest najlepsza praktyka wstawiania rekordu, jeśli jeszcze nie istnieje?