Isso continua a reunir votos adicionais, mesmo vários anos depois, e por isso preciso atualizá-lo para versões modernas do Sql Server. Para o Sql Server 2008 e posterior, é simples:
cast(getDate() As Date)
Observe que os últimos três parágrafos próximos à parte inferior ainda se aplicam, e muitas vezes você precisa dar um passo atrás e encontrar uma maneira de evitar o elenco em primeiro lugar.
Mas há outras maneiras de conseguir isso também. Aqui estão os mais comuns.
A maneira correta (nova desde o Sql Server 2008):
cast(getdate() As Date)
A maneira correta (antiga):
dateadd(dd, datediff(dd,0, getDate()), 0)
Agora é mais antigo, mas ainda vale a pena saber porque também pode se adaptar facilmente a outros pontos do tempo, como o primeiro momento do mês, minuto, hora ou ano.
Essa maneira correta usa funções documentadas que fazem parte do padrão ansi e que garantem o trabalho, mas podem ser um pouco mais lentas. Ele funciona descobrindo quantos dias existem do dia 0 ao dia atual e adicionando esses dias ao dia 0. Ele funcionará independentemente da data e hora armazenadas e da localidade.
O caminho mais rápido:
cast(floor(cast(getdate() as float)) as datetime)
Isso funciona porque as colunas datetime são armazenadas como valores binários de 8 bytes. Lance-os para flutuar, aplique-os no chão para remover a fração e a parte do tempo dos valores desaparece quando você os lança de volta à data e hora. Tudo muda um pouco, sem lógica complicada e é muito rápido.
Esteja ciente de que depende de um detalhe de implementação que a Microsoft pode mudar a qualquer momento, mesmo em uma atualização automática de serviço. Também não é muito portátil. Na prática, é muito improvável que essa implementação mude em breve, mas ainda é importante estar ciente do perigo se você optar por usá-la. E agora que temos a opção de lançar como uma data, raramente é necessário.
O caminho errado:
cast(convert(char(11), getdate(), 113) as datetime)
O caminho errado funciona convertendo para uma string, truncando a string e convertendo novamente em um datetime. Está errado , por duas razões: 1) pode não funcionar em todos os locais e 2) é a maneira mais lenta possível de fazer isso ... e não apenas um pouco; é como uma ordem de magnitude ou duas mais lenta que as outras opções.
Atualizar Isso tem recebido alguns votos recentemente e, por isso, quero acrescentar que, desde que publiquei isso, vi evidências bastante sólidas de que o Sql Server otimizará a diferença de desempenho entre a maneira "correta" e a "rápida" , o que significa que agora você deve favorecer o primeiro.
Em ambos os casos, você deseja escrever suas consultas para evitar a necessidade de fazer isso em primeiro lugar . É muito raro você fazer esse trabalho no banco de dados.
Na maioria dos lugares, o banco de dados já é seu gargalo. Geralmente, é o servidor mais caro para adicionar hardware para aprimoramentos de desempenho e o mais difícil de obter essas adições (você precisa equilibrar discos com memória, por exemplo). É também o mais difícil de expandir, tanto tecnicamente quanto do ponto de vista comercial; tecnicamente, é muito mais fácil adicionar um servidor da Web ou de aplicativos do que um servidor de banco de dados e, mesmo que isso fosse falso, você não paga mais de US $ 20.000 por licença de servidor para IIS ou apache.
O que estou tentando enfatizar é que, sempre que possível, você deve fazer esse trabalho no nível do aplicativo. O único momento em que você deve truncar uma data e hora no Sql Server é quando precisa agrupar por dia e, mesmo assim, você provavelmente deve ter uma coluna extra configurada como coluna computada, mantida no momento da inserção / atualização ou mantida na lógica da aplicação. Tire esse trabalho pesado de cpu e de índice do seu banco de dados.