sql >> Databasteknik >  >> RDS >> Sqlserver

SQL, Välj mellan datum/tid

Först och främst, använd inte Group som ett kolumnnamn. Det är ett reserverat ord i varje SQL-standard. Jag döpte om den till grp för syftet med mitt svar.

Försöker schemalägga ett nytt pass från '2012-06-01 08:00' till '2012-06-03 08:00' ...

INSERT INTO tbl (prim, grp, startdate, enddate)
SELECT 1, 10, '2012-06-01 08:00', '2012-06-03 08:00'
WHERE  NOT EXISTS (
    SELECT *
    FROM   tbl
    WHERE  prim = 1
    AND    grp = 10
    AND   '2012-06-03 08:00' > startdate -- not >= to allow sharing a border
    AND   '2012-06-01 08:00' < enddate   -- and not BETWEEN ... AND either
    )

Observera att jag jämför:

new_end   &gt old_start
new_start &lt old_end

Om du använder BETWEEN .. AND .. du inkluderar gränserna för ett skifte i ditt test. Det är samma sak som att använda >= och <= . Du måste använda > och < för att tillåta gränser att överlappa.

Tja, och prova min till stor del förenklade syntax. Inte säker på vad du hade där från början.
Här är en fungerande demo på sqlfiddle. se att leka med.




  1. exportera stora datatabelldata till .csv-fil i c# windows-program

  2. Hur frågar jag efter värden som har det högsta antalet röster och inga flaggor i PostgreSQL?

  3. Hur skapar man en MySQL-lagrad aggregatfunktion?

  4. Så här fixar du Illuminate\Database\QueryException:SQLSTATE[HY000] [1044] Åtkomst nekad för användaren