Pergunta

Usando o SQL Server 2005 Express.

(
    CONVERT(VARCHAR(8), R.reviewStart, 108) between CONVERT(VARCHAR(8), M.meetingStart, 108) and CONVERT(VARCHAR(8), M.meetingEnd, 108) OR
    CONVERT(VARCHAR(8), R.reviewEnd, 108) between CONVERT(VARCHAR(8), M.meetingStart, 108) and CONVERT(VARCHAR(8), M.meetingEnd, 108) OR
    CONVERT(VARCHAR(8), M.meetingStart, 108) between CONVERT(VARCHAR(8), R.reviewStart, 108) and CONVERT(VARCHAR(8), R.reviewEnd, 108) OR
    CONVERT(VARCHAR(8), M.meetingEnd, 108) between CONVERT(VARCHAR(8), R.reviewStart, 108) and CONVERT(VARCHAR(8), R.reviewEnd, 108)
)

Será que o "entre" ainda tem o comportamento esperado após os datetimes foram convertidos para varchar?

Graças

Foi útil?

Solução

Sim, dependendo do que você quer dizer com o comportamento esperado. A ENTRE operador irá tratar esses operandos como varchars, e aplicar as suas regras de comparação de acordo:

ENTRE retorna verdadeiro se o valor de test_expression é maior do que ou igual ao valor de begin_expression e inferior ou igual ao valor de end_expression.

Agora, eu posso ver um monte de problemas potenciais, comparando cordas e esperando comportamento de comparação data. Eu não vi nenhuma em meus testes, mas olhar atentamente para os seus dados. É o CONVERT retornando de 24 horas, com zeros à esquerda do apropriadas?

Esta questão tem algumas outras abordagens para comparar dateless -times, diferente de convertê-los em varchars.

Além disso, o relógio para datas nulos, o que fará com que a condição WHERE correspondente a falsa retorno (na verdade, desconhecido).

Na sua outra pergunta, você indicou que você estava recebendo um erro. Se assim for, você pode postar isso?

Outras dicas

Como eu disse em seu outro post, se é possível, você deve considerar a mudança para SQL 2008 por causa de t ele novos tipos de data e hora que permitem a separação explícita da parte da data e tempo parcial assim que suas expressões de filtro tornam-se muito mais simples e você pode indexar pelo tempo. Desde a sua expresso realmente não deve haver qualquer razão para retê-lo em 2005.

Sua primeira condição é equivalente a isso mais uma amigável índice:

R.reviewStart >=  DATEADD(day, DATEDIFF(day, '19010101', M.meetingStart), '19010101') 
and R.reviewStart < DATEADD(day, 1+DATEDIFF(day, '19010101', M.meetingStart), '19010101') 

(explicado aqui: reutilizar o seu código com FDU valor de tabela ) .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top