Pergunta

No SQL Server eu tenho um DATETIME coluna que inclui um elemento de tempo.

Exemplo:

'14 AUG 2008 14:23:019'

O que é melhor método para selecionar apenas os registros de um determinado dia, ignorando a parte horária?

Exemplo:(Não é seguro, pois não corresponde à parte do tempo e não retorna linhas)

DECLARE  @p_date DATETIME
SET      @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

SELECT *
FROM   table1
WHERE  column_datetime = @p_date

Observação:Dado que este site também trata de fazer anotações e técnicas que você aprende e depois esquece, vou postar minha própria resposta a essa pergunta, já que o material DATETIME no MSSQL é provavelmente o tópico que mais procuro no SQLBOL.


Atualizar Exemplo esclarecido para ser mais específico.


Editar Desculpe, mas tive que modificar respostas ERRADAS (respostas que retornam resultados errados).

@Jorrit: WHERE (date>'20080813' AND date<'20080815') retornará nos dias 13 e 14.

@wearejimbo: Perto, mas sem charuto! distintivo concedido a você.Você perdeu registros escritos em 14/08/2008 23:59:001 a 23:59:999 (ou seja,Menos de 1 segundo antes da meia-noite.)

Foi útil?

Solução

Técnica 1:

 DECLARE @p_date DATETIME
 SET     @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

 SELECT  *
 FROM    table1
 WHERE   column_datetime >= @p_date
 AND     column_datetime < DATEADD(d, 1, @p_date)

A vantagem disso é que usará qualquer índice em 'column_datetime', se existir.

Outras dicas

No SQL Server 2008, você poderia usar o novo tipo de dados DATE

DECLARE @pDate DATE='2008-08-14'  

SELECT colA, colB
FROM table1
WHERE convert(date, colDateTime) = @pDate  

@Cara.Acho que você descobrirá que esta solução é perfeitamente escalável.Dê uma olhada no plano de execução de consulta da sua consulta original.

E para meu:

Basta comparar os valores de ano, mês e dia.

Declare @DateToSearch DateTime
Set @DateToSearch = '14 AUG 2008'

SELECT * 
FROM table1
WHERE Year(column_datetime) = Year(@DateToSearch)
      AND Month(column_datetime) = Month(@DateToSearch)
      AND Day(column_datetime) = Day(@DateToSearch)

Algo assim?

SELECT  *
FROM    table1
WHERE   convert(varchar, column_datetime, 111) = '2008/08/14'

Técnica 2:

DECLARE @p_date DATETIME
SET     @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

SELECT  *
FROM    table1
WHERE   DATEDIFF( d, column_datetime, @p_date ) = 0

Se o campo column_datetime não estiver indexado e for improvável que o seja (ou é improvável que o índice seja usado), o uso de DATEDIFF() será mais curto.

Bom argumento sobre o índice na resposta que você aceitou.

Ainda assim, se você realmente pesquisar apenas em DATE ou DATE ranges muitas vezes, então a melhor solução que encontrei é adicionar outra coluna computada persistente à sua tabela que conteria apenas o DATE, e adicione o índice nesta coluna:

ALTER TABLE "table1" 
    ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED

Adicione o índice nessa coluna:

CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci"
ON  "table1" ( "column_date" ASC )
GO

Então sua busca será ainda mais rápida:

DECLARE  @p_date DATE
SET      @p_date = CONVERT( DATE, '14 AUG 2008', 106 )

SELECT   *
FROM     table1
WHERE    column_date = @p_date

Esta função Cast(Floor(Cast(GetDate() As Float)) As DateTime) retorna um tipo de dados datetime com a parte de tempo removida e pode ser usado como tal.

Select
*
Table1
Where
Cast(Floor(Cast(Column_DateTime As Float)) As DateTime) = '14-AUG-2008'

ou

DECLARE  @p_date DATETIME
SET      @p_date = Cast('14 AUG 2008' as DateTime)

SELECT   *
FROM     table1
WHERE    Cast(Floor(Cast(column_datetime As Float)) As DateTime) = @p_date

Como obter a parte DATE de um campo DATETIME no MS SQL Server:

Uma das maneiras mais rápidas e simples de fazer isso é usar

DATEADD(dd, DATEDIFF( dd, 0, @DAY ), 0)

Ele evita a lógica de "converter a data em uma string sem a hora e depois convertê-la novamente" da CPU.

Também não expõe a implementação interna de que a "parte do tempo é expressa como uma fração" da data.

Obtenha a data do primeiro dia do mês

DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0)

Obtenha a data de 1 ano atrás

DATEADD(m,-12,DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0))

Normalmente converto data e hora em data e comparo-as, assim:

SELECT 'Same Date' WHERE CAST(getDate() as date) = cast('2/24/2012 2:23 PM' as date)

ou

SELECT 'Same Date' WHERE DATEDIFF(dd, cast(getDate() as date), cast('2/24/2012 2:23 PM' as date)) = 0

Eu sei que não é exatamente assim que você deseja fazer, mas pode ser um começo:

SELECT *
FROM (SELECT *, DATEPART(yy, column_dateTime) as Year, 
      DATEPART(mm, column_dateTime) as Month, 
      DATEPART(dd, column_dateTime) as Day 
      FROM table1)
WHERE Year = '2008'
AND Month = '8'
AND Day = '14'
SELECT  *
FROM    table1
WHERE   CONVERT(varchar(10),columnDatetime,121) = 
        CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)

Isso converterá o datatime e a string em varchars no formato "AAAA-MM-DD".

Isso é muito feio, mas deve funcionar

A data pode ser comparada no sqlserver usando comparação de strings:por exemplo.

DECLARE @strDate VARCHAR(15)
SET @strDate ='07-12-2010'


SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
DECLARE @Dat

SELECT * 
FROM Jai
WHERE                                                                                                          
CONVERT(VARCHAR(2),DATEPART("dd",Date)) +'/'+                                                              
             CONVERT(VARCHAR(2),DATEPART("mm",Date)) +'/'+              
                     CONVERT(VARCHAR(4), DATEPART("yy",Date)) = @Dat

A melhor maneira é simplesmente extrair a parte da data usando a função SQL DATE():

SELECT * 
FROM table1
WHERE DATE(column_datetime) = @p_date;
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp

Existem muitos formatos de data em SQL que estão sendo especificados.Referir https://msdn.microsoft.com/en-in/library/ms187928.aspx

Convertendo e comparando coluna varchar com datas selecionadas.

Sintaxe:

SELECT * FROM tablename where CONVERT(datetime,columnname,103) 
    between '2016-03-01' and '2016-03-03'
In CONVERT(DATETIME,COLUMNNAME,103) "103" SPECIFIES THE DATE FORMAT as dd/mm/yyyy

No sqlserver

DECLARE @p_date DATE

SELECT * 
FROM table1
WHERE column_dateTime=@p_date

Em C#, passe a série curta da data de data usando a função ToshortDateSTRING ().amostra:DateVariable.ToShortDateString();

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