Comparaisons de dates SQL Server en fonction du mois et de l'année uniquement
J'ai de la difficulté à déterminer la meilleure façon de comparer les dates en SQL en fonction du mois et de l'année seulement.
Nous faire des calculs basés sur les dates et depuis la facturation se fait sur une base mensuelle à la date du mois qui a fait plus obstacle.
Par exemple
DECLARE @date1 DATETIME = CAST('6/15/2014' AS DATETIME),
@date2 DATETIME = CAST('6/14/2014' AS DATETIME)
SELECT * FROM tableName WHERE @date1 <= @date2
L'exemple ci-dessus ne serait pas de retour de toutes les lignes depuis @date1 est supérieure à @date2. Je voudrais donc trouver un moyen de prendre le jour de l'équation.
De même, la situation suivante me donne du chagrin pour la même raison.
DECLARE @date1 DATETIME = CAST('6/14/2014' AS DATETIME),
@date2 DATETIME = CAST('6/15/2014' AS DATETIME),
@date3 DATETIME = CAST('7/1/2014' AS DATETIME)
SELECT * FROM tableName WHERE @date2 BETWEEN @date1 AND @date3
J'ai fait inline conversions les dates de dériver le premier jour et le dernier jour du mois pour la date spécifiée.
SELECT *
FROM tableName
WHERE date2 BETWEEN
DATEADD(month, DATEDIFF(month, 0, date1), 0) -- The first day of the month for date1
AND
DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, date2) + 1, 0)) -- The lastday of the month for date3
Il y a un moyen plus facile de le faire. Des suggestions?
source d'informationauteur Andy Evans
Vous devez vous connecter pour publier un commentaire.
Pour gérer les inégalités, entre les deux, je voudrais convertir les dates/heures, à un AAAAMM représentation, soit comme une chaîne ou un entier. Pour cet exemple:
Je voudrais écrire la requête:
Vous pouvez filtrer le mois et l'année d'une date donnée et la date du jour comme suit:
Il suffit de remplacer le
GETDATE()
méthode avec votre date souhaitée.Tout d'abord, je voudrais utiliser un format pour les dates c'est sans équivoque, comme le standard
'YYYYMMDD'
et pas le'6/15/2014'
vous avez été à l'aide. Aaron Bertrand blog qui explique bien mieux que je pouvais, de différentes façons, ce qui peut aller mal:Les mauvaises habitudes pour le coup : une mauvaise manipulation de date /plage de requêtes
Pour le problème spécifique, votre dernière requête qui trouve le premier et le dernier jours du mois (pour date1 et date3), est à mon avis sur la bonne voie. Vous avez seulement besoin bien que les premiers jours du mois (le premier jour du date1 et le premier jour du mois prochain pour date3), si vous évitez les mal
BETWEEN
: Ce n'ENTRE et le diable ont-ils en commun?La requête fonctionne comme il est, peu importe le type de données de
date2
(DATE
DATETIME
DATETIME2
ouSMALLDATTEIME
).Point de Bonus, les index sur
date2
seront considérés par l'optimiseur de cette façon.Amélioration, d'après (pourtant, un autre), Aaron blog, pour éviter un problème avec l'estimation de cardinalité lors de l'évaluation d'expressions avec
DATEDIFF()
:La Performance des Surprises et des Hypothèses : DATEDIFF
Vous pouvez vous inscrire en
MOIS
etANNÉE
valeurs de ces dates: