Je suis bloqué sur un problème sur une mission où je dois changer la date au nombre d'années:
Créer une requête qui montrera à ces employés qui a quitté tante B en 2014. P>
Dans votre sortie montrent l'identifiant des personnes, la date d'embauche, la date de durée et les années utilisées. P>
Titre de cette dernière colonne Votre sortie doit ressembler à ce qui suit: p> Ceci est mon code: P> des années utilisées code>. p> select PeopleId, HireDate,TermDate
from WORKERS
where TermDate like '%2014%'
floor(datediff('2010-06-22','2014-01-15', TermDate) / 365) as 'Years Employed'
5 Réponses :
Utiliser datrodiff () code>:
daturant code> a besoin jour code> en tant que 1er argument, comme celui-ci: select
PeopleId,
HireDate,
TermDate,
floor(datediff(day, HireDate, TermDate) / 365) as [Years Employed]
from WORKERS
where year(TermDate) = 2014
Utilisation de fonctions dans votre où code> est une très mauvaise pratique et que SQL Server ignore les index pertinents de cette colonne: DaTellBlog.WordPress.com/2016/11/24/...
Vous avez fait votre point, mais b> Vous n'avez pas dit quelle est l'alternative. Voulez-vous publier une solution plus efficace pour ce problème sans utiliser de fonctions b> et expliquer pourquoi il est plus efficace?
Tout simplement, vous ne modifiez pas la valeur dans la colonne, mais comparez-la, telle que: où termdate> = '20140101' et termdate <'20150101' code>, comme cela est expliqué dans l'article lié.
Super, vous changez 1 comparaison avec 2!
Oui, mais 2 comparaisons que SQL Server est suffisamment intelligente pour appliquer dans une carte d'index sur la colonne code> Termindate code>, qui est significativement i> b> plus rapide que Application de la fonction code> code> à chaque valeur de la colonne et de la vérification si le résultat est 2014 code>. Il semblerait que vous ayez besoin de lire sur ce qui permet une requête SQL Server efficace. Je recommanderais de commencer avec le concept de sargabilité qui est expliqué dans le lien dans mon commentaire précédent.
De plus, votre solution ne tient pas non plus compte des années de bonds.
Laissez-nous Continuez cette discussion en chat .
select PeopleId, HireDate, TermDate, SUM(DATEDIFF(DAY,HireDate,TermDate )) / 365.0 AS YEARS_EMPLOYEED from WORKERS where year(TermDate) = 2014 here is a good tutorial on how it works:https://www.w3schools.com/sql/func_sqlserver_datediff.asp
datrodiff code> dans des années, mais ce n'est peut-être pas ce que vous voulez réellement faire, en raison de la façon dont datrodiff code> fonctionne . datrodiff code> ne calculcule pas le nombre de périodes complètes ou même partielles entre le début et l'heure de fin donnés. Il calcule le nombre de limites de la période croisés. Em> p> Qu'est-ce que cela signifie que pour tous ces calculs: p> xxx pré> vous retournerait la valeur 1 code> même s'il n'y a que 3 millisecondes différence entre les deux dates, juste comme suit: p> xxx pré> retournerait également 1 code>, même si la période ne représente que 3 millisecondes à moins de 2 années complètes. P> En raison de cela, vous devez sélectionner une période plus petite pour regrouper et diviser cela en une granularité annuelle pour obtenir votre Valeur souhaitée. Personnellement, j'utilise le nombre d'heures dans une année moyenne em> em>, qui prendra des années de saut en compte. P> par vos exemples donnés, vous pouvez revenir soit: P>
select datediff(hour, '2010-06-22', '2014-01-15') / 8766 as WholeYears -- 3
,datediff(hour, '2010-06-22', '2014-01-15') / 8766.0 as DecimalYears -- 3.567419
Où est l'endroit où ... une partie?
Sélectionnez Daturadiff (jour, '2010-06-22', '2014-01-15') / 8766 En tant que Fullyears, DaturdeIff (Jour, '2010-06-22', '2014-01-15') / 8766.0 En tant que décimalyears Code> Pourquoi vous divisez-vous avant 8766? Si vous exécutez cette requête exacte, il retournera 0 ou 0,148642.
@ K.madden ah, typo. Aurait dû être heure code> au lieu de jour code>
@iamdave pas de problème! Était juste confus et commençait à remettre en question mes mathématiques!
Peut-être que je suis aveugle mais je ne peux toujours voir aucune réponse!
@Forpas Stack Overflow n'est pas un service de rédaction de code. L'OP est venu ici avec une question sur une affectation qu'ils doivent faire et spécifiquement interrogées sur la recherche du nombre d'années entre deux dates. Ce bloc de code tiers contient comment obtenir un nombre plus précis d'années entre deux dates. Si l'OP peut prendre ce que j'ai écrit et l'appliquer à leur mission, plutôt que de copier et de coller simplement, ils développeront leur compréhension et être en mesure d'appliquer ces connaissances à différentes situations à l'avenir.
Mot-clé dans l'original de l'OP - "Affectation". Un étudiant n'apprendra pas grand chose si la réponse complète est donnée.
@forpas La différence est que non chaque i> répond à un script de travail complet pour être une réponse utile. Parfois, il est plus facile de fournir une comme une explication, d'autres fois pas. Je pense que vous devez vous calmer et vous demander pourquoi vous prenez ce site si sérieusement. Un étudiant a posé une question et vous êtes clairement très énervé d'avoir fourni une explication détaillée sur les nuances des fonctions que d'autres recommandent, que, si elles ne sont pas considérées peuvent causer des problèmes.
SELECT @Start,@Term,DATEDIFF(YEAR,@Start,@Term) AS [Years Employed]
En supposant que votre
Hiredate code> etTermindate code> Les colonnes sontDate de la date code> Types de données, vous devez filtrer à l'aide des valeurs de date, telles queoù terminez> = ' 20140101 'et termdate <' 20150101 ' code> qui fonctionnera beaucoup plus rapidement que de convertir la date à une chaîne code> varchar code>, puis recherchez la chaîne entière pour2014 code>.