sql >> Databáze >  >> RDS >> Sqlserver

Kontrolní omezení překrývajícího se období

CHECK se provádí po řádek byl vložen, takže rozsah se překrývá sám se sebou.

Budete muset upravit své WHERE tak, aby zahrnovalo něco jako:@MyTableId <> MyTableId .

BTW, váš výraz WHERE lze zjednodušit.

Rozsahy není překrývají se, pokud:

  • konec jednoho rozsahu je před začátkem druhého
  • nebo začátek jednoho rozsahu je po konci druhého.

Což by mohlo být napsáno v SQL jako:

WHERE @DateEnd < DateStart OR DateEnd < @DateStart

Negujte to, abyste získali rozsahy, které dělají překrývají...

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

...což je podle De Morganových zákonů stejné jako...

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

...což je stejné jako:

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

Takže vaše konečné KDE by mělo být:

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

[SQL Fiddle]

POZNÁMKA:Chcete-li povolit rozsahům "dotyk", použijte <= v počátečním výrazu, který by vytvořil > v konečném výrazu.



  1. SQL Server Aktivační událost pro práci s vkládáním více řádků

  2. Jak získat rok a měsíc z data v MySQL

  3. Používejte mycli a učte se MariaDB/MySQL pohodlně v terminálu!

  4. mysql vyberte skupinu součtu podle data