0
votes

Date de conversion au nombre d'années

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 des années utilisées code>. p>

Votre sortie doit ressembler à ce qui suit: p> xxx pré>

Ceci est mon 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'


1 commentaires

En supposant que votre Hiredate et Termindate Les colonnes sont Date de la date Types de données, vous devez filtrer à l'aide des valeurs de date, telles que où terminez> = ' 20140101 'et termdate <' 20150101 ' qui fonctionnera beaucoup plus rapidement que de convertir la date à une chaîne varchar , puis recherchez la chaîne entière pour 2014 .


5 Réponses :


1
votes

Utiliser datrodiff () : xxx


0 commentaires

0
votes

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


7 commentaires

Utilisation de fonctions dans votre 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 Vous n'avez pas dit quelle est l'alternative. Voulez-vous publier une solution plus efficace pour ce problème sans utiliser de fonctions 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' , 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 Termindate , qui est significativement plus rapide que Application de la fonction à chaque valeur de la colonne et de la vérification si le résultat est 2014 . 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 .



0
votes
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

0 commentaires

-1
votes

Beaucoup de réponses ici vous disent simplement à utiliser le 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


8 commentaires

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 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 au lieu de jour


@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 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.



-1
votes
SELECT @Start,@Term,DATEDIFF(YEAR,@Start,@Term) AS [Years Employed]

0 commentaires