2008-09-22 4 views
1

Comment récupérer les anniversaires de tous les clients pour un mois donné en SQL? Qu'en est-il de MySQL? Je pensais utiliser ce qui suit avec le serveur SQL.Quote Anniversaire SQL Query

select c.name 
from cust c 
where datename(m,c.birthdate) = datename(m,@suppliedDate) 
order by c.name 
+0

pourquoi pas ce travail pour MySQL? ils ont sûrement une datepart() équivalente? –

+0

EXTRAIT semble faire ce que je suppose que datepart() fait. par exemple: SELECT EXTRACT (jour FROM myDate'). Il y a des fonctions individuelles pour chaque partie (day(), month(), year(), etc) – nickf

Répondre

5

ne pas oublier le 29 Février ...

SELECT c.name 
FROM cust c 
WHERE (
    MONTH(c.birthdate) = MONTH(@suppliedDate) 
    AND DAY(c.birthdate) = DAY(@suppliedDate) 
) OR (
    MONTH(c.birthdate) = 2 AND DAY(c.birthdate) = 29 
    AND MONTH(@suppliedDate) = 3 AND DAY(@suppliedDate) = 1 
    AND (YEAR(@suppliedDate) % 4 = 0) AND ((YEAR(@suppliedDate) % 100 != 0) OR (YEAR(@suppliedDate) % 400 = 0)) 
) 
+0

L'anniversaire légal d'une personne née le 29 février dépend en fait des paramètres régionaux - [selon Wikipedia] [1], il est le 28 février en Angleterre, par exemple. [1]: http://en.wikipedia.org/wiki/February_29#Births – gregmac

+0

bien dans ce cas, ajuster en conséquence. – nickf

+0

Nice :-) La sagesse comme ça ne peut venir que de l'expérience :-) –

2

Personnellement, je l'utilise DATEPART au lieu de DATENAME comme DATENAME est ouvert à l'interprétation en fonction des paramètres régionaux.

1

je réellement tenté d'ajouter une colonne de BirthMonth, si vous attendez la liste des clients pour obtenir très grande. Jusqu'à présent, les requêtes que j'ai vues (y compris l'exemple) nécessiteront une analyse de table complète, car vous passez la colonne de données à une fonction et la comparez. Si la taille de la table est quelconque, cela peut prendre beaucoup de temps, car aucun index ne pourra vous aider.

Donc, j'ajouter la colonne BirthMonth (indexé) et juste faire (avec MySQLisms possibles):

SELECT name 
FROM cust 
WHERE birthmonth = MONTH(NOW()) 
ORDER BY name; 

Bien sûr, il devrait être facile de définir la colonne BirthMonth soit avec un déclencheur ou votre code client.

2

Si vous demandez à tous les anniversaires dans un mois donné, vous devez fournir le mois, pas une date :

SELECT c.name 
FROM cust c 
WHERE datepart(m,c.birthdate) = @SuppliedMonth