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.
cast(getdate() as date)
?getdate()
aqui está um substituto para qualquer fonte de data e hora que você possa ter.Somente para o SQL Server 2008
Em seguida, transmita-o de volta para data e hora, se desejar
fonte
Apenas para obter uma resposta mais completa, aqui está uma maneira de truncar qualquer parte da data e incluir minutos (substitua
GETDATE()
pela data a ser truncada).Isso é diferente da resposta aceita, pois você pode usar não apenas
dd
(dias), mas qualquer parte da data (veja aqui ):Observe que na expressão acima,
0
é uma data constante no início de um ano (1900-01-01). Se você precisar truncar para peças menores, como segundos ou milissegundos, precisará de uma data constante mais próxima da data a ser truncada para evitar um estouro.fonte
dateadd(minute, datediff(minute, 0, GETDATE()) / 15 * 15, 0)
O trecho que encontrei na Web quando precisei fazer isso foi:
fonte
DateAdd(dd, DateDiff(...), 0)
. Isso pode morder você, se você não for cuidadoso.No SQl 2005, sua função trunc_date poderia ser escrita assim.
(1)
O primeiro método é muito mais limpo. Ele usa apenas três chamadas de método, incluindo o CAST final (), e não executa concatenação de cadeias, que é uma vantagem automática. Além disso, não há modelos enormes aqui. Se você pode imaginar que os carimbos de data / hora podem ser representados, a conversão de datas para números e de volta para datas é um processo bastante fácil.
2)
Se você está preocupado com a implementação de data / hora da Microsoft (2) ou (3), tudo bem.
(3)
Terceiro, o método mais detalhado. Isso requer que a data seja dividida em partes do ano, mês e dia, reunindo-as no formato "aaaa / mm / dd" e, em seguida, convertendo-a novamente em uma data. Este método envolve 7 chamadas de método, incluindo o CAST final (), sem mencionar a concatenação de cadeias.
fonte
fonte
selecione conversão (floor (conversão (getdate () como float)) como datetime) Faça referência a: http://microsoftmiles.blogspot.com/2006/11/remove-time-from-datetime-in-sql-server.html
fonte
Para aqueles que vieram aqui procurando uma maneira de truncar um campo DATETIME para algo menos que um dia inteiro, por exemplo, a cada minuto, você pode usar o seguinte:
então, se hoje fosse
2010-11-26 14:54:43.123
, isso retornaria2010-11-26 14:54:00.000
.Para alterar o intervalo para o qual ele substitui, substitua 1440.0 pelo número de intervalos em um dia, por exemplo:
(Sempre coloque um
.0
no final para converter implicitamente em um flutuador.)Para aqueles que se perguntam para que servem os
(3.0/86400000)
meus cálculos, o SQL Server 2005 não parece ser transmitidoFLOAT
comDATETIME
precisão, portanto, isso adiciona 3 milissegundos antes de ser aplicado.fonte
datetime2
tipo de dados.Essa consulta deve fornecer um resultado equivalente ao
trunc(sysdate)
Oracle.Espero que isto ajude!
fonte
Você também pode extrair a data
using Substring
da variável datetime e a conversão para datetime ignorará a parte do tempo.Além disso, você pode acessar partes da variável datetime e mesclá-las a uma data truncada de construção, algo como isto:
fonte
Oráculo:
Servidor SQL:
Pode ser usado da mesma forma para truncar minutos ou horas a partir de uma data.
fonte
você poderia fazer isso (SQL 2008):
28-05-2009
fonte
TRUNC (aDate, 'DD') truncará os minutos, segundos e horas
SRC: http://www.techonthenet.com/oracle/functions/trunc_date.php
fonte