Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL, Selecionando entre data/hora


Primeiro, não use Group como um nome de coluna. É uma palavra reservada em todos os padrões SQL. Eu o renomeei para grp para efeito da minha resposta.

Tentando agendar um novo turno de '2012-06-01 08:00' para '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
    )

Note que eu comparo:
new_end   &gt old_start
new_start &lt old_end

Se você usar BETWEEN .. AND .. você inclui as bordas de um deslocamento em seu teste. É o mesmo que usar >= e <= . Você precisa usar > e < para permitir que as bordas se sobreponham.

Bem, e tente minha sintaxe amplamente simplificada. Não tenho certeza sobre o que você tinha lá originalmente.
Aqui está uma demonstração de trabalho no sqlfiddle. com Brincar com.