2008-10-21 6 views
4

Je vais dépoussiérer mon chapeau VBScript et écrire un ASP classique pour interroger une base de données SQL Server 2000.Comment puis-je comparer deux champs datetime mais ignorer l'année?

Voici le scénario:

  • J'ai deux datetime champs appelés FieldA et FieldB.
  • FieldB aura jamais une valeur de l'année qui est supérieure à l'année de FieldA
  • Il est possible que deux les champs auront la même année.

Ce que je veux tous les enregistrements où FieldA> = FieldB, indépendante de l'année. Juste prétendre que chaque champ est juste un mois & jour.

Comment puis-je obtenir ceci? Ma connaissance des fonctions date/heure de T-SQL est au mieux inégale.

Répondre

13

Vous pouvez utiliser les fonctions intégrées de temps telles que le jour et le mois. par exemple.

SELECT * from table where 
MONTH(fieldA) > MONTH(fieldB) OR(
MONTH(fieldA) = MONTH(fieldB) AND DAY(fieldA) >= DAY(fieldB)) 

Sélection toutes les lignes où soit le mois de l'FieldA est plus ou les mois sont les mêmes et le jour de FieldA est plus.

+0

J'avais oublié la sténographie. C'est probablement mieux. – tvanfosson

+0

Les autres réponses ont de bonnes choses en eux, mais cela correspond à mon besoin le meilleur. –

3
select * 
from t 
where datepart(month,t.fieldA) >= datepart(month,t.fieldB) 
     or (datepart(month,t.fieldA) = datepart(month,t.fieldB) 
      and datepart(day,t.fieldA) >= datepart(day,t.fieldB)) 

Si vous vous souciez heures, minutes, secondes, vous aurez besoin d'étendre ce pour couvrir les cas, bien qu'il puisse être plus rapide de lancer une chaîne appropriée, retirez l'année et comparer.

select * 
from t 
where substring(convert(varchar,t.fieldA,21),5,20) 
     >= substring(convert(varchar,t.fieldB,21),5,20) 
2
SELECT * 
FROM SOME_TABLE 
WHERE MONTH(fieldA) > MONTH(fieldB) 
OR (MONTH(fieldA) = MONTH(fieldB) AND DAY(fieldA) >= DAY(fieldB)) 
0

J'aborderions ce dans une perspective de date ordinale, convertir chaque champ dans la date Julian (nombre de jours après la première année), puis de comparer ces valeurs.

Cela peut ou non produire les résultats souhaités en ce qui concerne les années bissextiles. Si vous étiez préoccupé par les heures, les minutes, les secondes, etc., vous pouvez ajuster les fonctions DateDiff pour calculer le nombre d'heures (ou minutes ou secondes) depuis le début de l'année.

 
SELECT * 
FROM SOME_Table 
WHERE DateDiff(d, '1/01/' + Cast(DatePart(yy, fieldA) AS VarChar(5)), fieldA) >= 
     DateDiff(d, '1/01/' + Cast(DatePart(yy, fieldB) AS VarChar(5)), fieldB) 
0

table temporaire pour les tests

Create table #t (calDate date) 
Declare @curDate date = '2010-01-01' 
while @curDate < '2021-01-01' 
begin 
    insert into #t values (@curDate) 
    Set @curDate = dateadd(dd,1,@curDate) 
end 

Exemple d'une date supérieure ou égale à aujourd'hui

Declare @testDate date = getdate() 
SELECT * 
FROM #t 
WHERE datediff(dd,dateadd(yy,1900 - year(@testDate),@testDate),dateadd(yy,1900 - year(calDate),calDate)) >= 0 

Un autre exemple avec un jour de moins qu'aujourd'hui

Declare @testDate date = getdate() 
SELECT * 
FROM #t 
WHERE datediff(dd,dateadd(yy,1900 - year(@testDate),@testDate),dateadd(yy,1900 - year(calDate),calDate)) < 0 
Questions connexes