2009-02-13 9 views
5

Utilisation de SQL Server 2005 J'ai un champ qui contient une valeur datetime.Comparer la date du jour avec la date-heure enregistrée en utilisant un mois par an seulement

Ce que je suis en train de faire est de créer 2 requêtes:

  1. Comparer pour voir si datetime stocké est du même mois + année que la date actuelle
  2. Comparer pour voir si datetime stocké est du même année comme date actuelle

Il y a probablement une solution simple mais je continue de frapper les murs de briques en utilisant divers échantillons que je peux trouver, des pensées?

Merci d'avance.

Répondre

7

Comparez les parties de la date:

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

S'il vous plaît voir le commentaire de Cadaeic ci-dessous, ce n'est pas une bonne idée ... Votre application va ralentir que les données deviennent plus grandes ... –

0

La fonction datepart vous permet de tirer les bits dont vous avez besoin:

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

Vous pouvez utiliser quelque chose comme ça

une

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

b)

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

Il me semble DATEDIFF est exactement ce dont vous avez besoin:

-- #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

Alors que les autres réponses fonctionnent, ils souffrent tous du même problème: ils appliquent une transformation à la colonne et n'utilisera donc jamais un index sur cette colonne.

Pour rechercher la date sans transformation, vous avez besoin de quelques fonctions intégrées et de quelques calculs mathématiques. Exemple ci-dessous:

--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 

Qu'est-ce que la déclaration fait pour éviter les transformations, est de trouver toutes les valeurs plus grand ou égal au début de la période en cours (mois ou année) et toutes les valeurs moins que le début de la période de temps suivante (invalide). Cela résout notre problème d'index et atténue également tous les problèmes liés à l'arrondi 3ms dans le type DATETIME.

Questions connexes