2009-02-13 22 views
5

Utilizando SQL Server 2005 tengo un campo que contiene un valor de fecha y hora.Comparar la fecha actual con la fecha y hora almacenada usando el mes de un año solamente

Lo que estoy tratando de hacer es crear 2 consultas:

  1. Compare para ver si datetime almacenado es del mismo mes + año como fecha actual
  2. Compare para ver si la fecha y hora almacenada es de la misma año como fecha actual

Probablemente haya una solución simple, pero sigo golpeando paredes de ladrillo con varias muestras que puedo encontrar, ¿alguna idea?

Gracias de antemano.

Respuesta

7

Compare las partes de la fecha:

WHERE YEAR(columnName) = YEAR(getDate()) 
+1

Consulte el comentario de Cadaeic a continuación, esta NO es una buena idea ... Su aplicación se ralentizará a medida que los datos crezcan ... –

0

La función datepart podrás extraer los bits que necesita:

declare @d1 as datetime 
declare @d2 as datetime 

if datepart(yy, @d1) = datepart(yy, @d2) and datepart(mm, @d1) = datepart(mm, @d2) begin 
    print 'same' 
end 
2
SELECT * FROM atable 
WHERE 
    YEAR(adate) = YEAR(GETDATE()) 
AND 
    MONTH(adate) = MONTH(GETDATE()) 
0

Puede usar algo como esto

una)

select * 
from table 
where MONTH(field) = MONTH(GetDATE()) 
    and YEAR(field) = YEAR(GetDATE()) 

b)

select * 
from table 
where YEAR(field) = YEAR(GetDATE()) 
2

Me suena como DATEDIFF es exactamente lo que necesita:

-- #1 same month and year 
SELECT * 
FROM your_table 
WHERE DATEDIFF(month, your_column, GETDATE()) = 0 

-- #2 same year 
SELECT * 
FROM your_table 
WHERE DATEDIFF(year, your_column, GETDATE()) = 0 
5

Mientras que las otras respuestas van a trabajar, todos ellos adolecen del mismo problema: se aplican una transformación a la columna y, por lo tanto, nunca utilizará un índice en esa columna.

Para buscar la fecha sin una transformación, necesita un par de funciones integradas y algunas matemáticas. Ejemplo a continuación:

--create a table to hold our example values 
create table #DateSearch 
(
    TheDate datetime not null 
) 


insert into #DateSearch (TheDate) 
--today 
select getdate() 
union all 
--a month in advance 
select dateadd(month, 1, getdate()) 
union all 
--a year in advance 
select dateadd(year, 1, getdate()) 
go 

--declare variables to make things a little easier to see 
declare @StartDate datetime, @EndDate datetime 

--search for "same month+year as current date" 
select @StartDate = dateadd(month, datediff(month, 0, getdate()), 0), @EndDate = dateadd(month, datediff(month, 0, getdate()) + 1, 0) 

select @StartDate [StartDate], @EndDate [EndDate], TheDate from #DateSearch 
where TheDate >= @StartDate and TheDate < @EndDate 

--search for "same year as current date" 
select @StartDate = dateadd(year, datediff(year, 0, getdate()), 0), @EndDate = dateadd(year, datediff(year, 0, getdate()) + 1, 0) 

select @StartDate [StartDate], @EndDate [EndDate], TheDate from #DateSearch 
where TheDate >= @StartDate and TheDate < @EndDate 

Lo que la declaración hace para evitar las transformaciones, es encontrar todos los valores de mayor que o igual a comienzos del período de tiempo actual (meses o años) y todos los valores menos que el principio del siguiente período de tiempo (inválido). Esto resuelve nuestro problema de índice y también mitiga cualquier problema relacionado con el redondeo de 3ms en el tipo DATETIME.

Cuestiones relacionadas