2009-03-25 6 views
0

Ceci est lié à Floor a date in SQL server, mais je prends un peu plus loin:Quelle est la meilleure façon d'effectuer des calculs sur une date planifiée dans SQL Server?

J'écris une requête sur une table SQL Server et je veux obtenir tous les records pour l'année civile en cours et l'année civile précédente . Donc, maintenant, je voudrais une requête pour retourner tous les enregistrements entre le 1er janvier 2008 et aujourd'hui. Mais venez 1er Janvier 2010, je veux revenir les dossiers datant de moins de 2009.

Essentiellement, je veux étage la date actuelle au début de l'année, puis soustraire 1.

Après fouillant dans certains Documentation SQL Server, je suis venu avec ceci:

WHERE create_date >= CAST((CAST(YEAR(GETDATE()) AS int) -1) AS varchar) 

mais il se sent un peu moche. Y a-t-il un meilleur moyen?

Répondre

4

Pourquoi ne pas simplement utiliser la fonction year sur create_date?

WHERE YEAR(create_date) >= (YEAR(GETDATE()) -1) 

Cela suppose (comme vous l'avez fait) qu'il n'y a pas d'enregistrements dans la base de données supérieure à la date d'aujourd'hui

0

Je suggère l'attribution d'une variable la date lastyear-01-01, soit en faisant une UDF pour elle, ou quelque chose comme

DECLARE @startOfLastYear DATETIME 
SET @startOfLastYear = CAST(YEAR(GETDATE()) - 1 AS VARCHAR) + '-01-01' 

faire ensuite la requête:

WHERE create_date >= @startOfLastYear 

deux raisons:

  1. Utilisation an() ou toute autre fonction sur les données de tables (à savoir ANNÉE (create_date)) rend indices inutilisable et diminue les performances de la requête
  2. Le nom de la variable indique exactement ce qu'il est, et la lecture du code est plus facile.
Questions connexes