2011-03-07 8 views
1

je veux faire une sélection, où l'anniversaire des utilisateurs (champ de date) est inférieure à 30 jours.
quelle est la meilleure façon de le faire? J'ai essayé le datediff, mais je ne sais pas comment mettre l'année de côté.SQL Diff abstraction faite Année

Merci

Répondre

5

Vous pouvez simplement utiliser la fonction DATEPART avec dayofyear valeur datepart.

EDIT: Honnêtement, il y a un problème de limite dans ma réponse précédente (merci beaucoup à Damien): par exemple. 2010-12-25 et 2011-01-07 => la différence devrait être inférieure à 30 jours, mais DATEPART(dayofyear, @date) - DATEPART(dayofyear, [Birthday]) < 30 état sauterait cet enregistrement. Donc, j'ai ajouté un contition supplémentaire à ma réponse:

DATEPART(dy, @d) - DATEPART(dy, [Birthday]) < 30 OR 
(
    DATEPART(mm, @d) = 12 AND 
    DATEPART(dy, DATEADD(m, 1, @d)) - DATEPART(dy, DATEADD(m, 1, [Birthday])) < 30 
) 

il ajoute un mois à la chaque date dans le cas où la partie de mois de la première date est Décembre et compare la différence.

+1

Cela ne pose-t-il pas des problèmes aux alentours de décembre/janvier? –

+0

@Damien_The_Unbeliever: merci beaucoup, il y avait vraiment ce problème; mis à jour ma réponse. – Alex

2

Une façon courante consiste à composer une date formatée, sous forme de texte, et remplacer l'année avec l'année en cours; et analyser en arrière dans une date. Appliquez le datediff sur cela.

Si vous trouvez quelque chose de négatif DATEDIFF renvoie donc l'anniversaire de cette année est dans le passé, ajouter 1 an, et essayez à nouveau. C'est pour la période autour du Nouvel An.

0
SELECT * 
FROM dbo.CheckBirthDay 
WHERE (CASE WHEN YEAR(BirthDay) <= YEAR(CURRENT_TIMESTAMP) THEN DATEDIFF(DD,BirthDay,CURRENT_TIMESTAMP) END < 30)