Eu tenho duas tabelas onde coluna [date]
é o tipo de DATETIME2(0)
.
Eu tenho que comparar dois registros apenas pelas partes Date (dia + mês + ano), descartando partes Time (horas + minutos + segundos).
Como eu posso fazer isso?
fonte
Eu tenho duas tabelas onde coluna [date]
é o tipo de DATETIME2(0)
.
Eu tenho que comparar dois registros apenas pelas partes Date (dia + mês + ano), descartando partes Time (horas + minutos + segundos).
Como eu posso fazer isso?
Use o CAST
para o novo DATE
tipo de dados no SQL Server 2008 para comparar apenas a parte da data:
IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)
Uma pequena desvantagem na resposta de Marc é que os dois campos de datas foram impressos, o que significa que você não poderá alavancar nenhum índice.
Portanto, se houver necessidade de escrever uma consulta que possa se beneficiar de um índice em um campo de data, a seguinte abordagem (bastante complicada) será necessária.
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
PS: Outro meio de extrair apenas a data (em versões mais antigas do SQL Server) é usar um truque de como a data é representada internamente.
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
Embora tenha votado positivamente na resposta marcada como correta. Eu queria tocar em algumas coisas para quem se deparar com isso.
Em geral, se você estiver filtrando especificamente apenas os valores de Data . A Microsoft recomenda usar o formato neutro de idioma de ymd
ou y-m-d
.
Observe que o formulário '2007-02-12' é considerado neutro em idioma apenas para os tipos de dados DATE, DATETIME2 e DATETIMEOFFSET.
Fazer uma comparação de datas usando a abordagem mencionada acima é simples. Considere o seguinte exemplo artificial.
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
CONVERT(char(8), OrderDate, 112) = @filterDate
Em um mundo perfeito, a execução de qualquer manipulação na coluna filtrada deve ser evitada, pois isso pode impedir o SQL Server de usar índices com eficiência. Dito isto, se os dados que você está armazenando estão preocupados apenas com a data e não com a hora, considere armazenar DATETIME
com a meia-noite como a hora. Porque:
Quando o SQL Server converte o literal no tipo da coluna filtrada, ele assume a meia-noite quando uma parte do tempo não é indicada. Se você deseja que esse filtro retorne todas as linhas a partir da data especificada, certifique-se de armazenar todos os valores com a meia-noite como a hora.
Assim, supondo que você esteja preocupado apenas com a data e armazene seus dados como tal. A consulta acima pode ser simplificada para:
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)
select
*
from
Sales.Orders
where
OrderDate = @filterDate
Você pode tentar este
CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000')
Eu testo isso para o MS SQL 2014 seguindo o código
select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok'
else '' end
Para Compare duas datas como MM / DD / AAAA a MM / DD / AAAA . Lembre-se de que o primeiro tipo de coluna do campo deve ser dateTime. Exemplo: columnName: payment_date dataType: datetime .
Depois disso, você pode facilmente compará-lo. A consulta é:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
É muito simples ...... Ele testou .....