2017-10-04 2 views
0

Je veux prendre les 5 dernières semaines avant la semaine précédant la semaine en cours. Aujourd'hui est le 4 octobre 2017 donc je veux plage de dates pour se situer entre 21 août-Sep 24. Voici le code que je utilise, mais il ne fonctionne pas pour une raison:5 dernières semaines avant la dernière semaine en SQL

DATEADD(week, -5, GETDATE()) and DATEADD(week, -1, GETDATE()) 

J'ai aussi essayé DATEADD(week, -6, GETDATE()) and DATEADD(week, -2, GETDATE()) mais aucun changement n'arrive, tellement bizarre.

Quelqu'un peut-il m'aider s'il vous plaît. Sa requête sql dans SQL 2012.

WHERE hire_date between DATEADD(week, -6, GETDATE()) and DATEADD(week, -2, GETDATE()) 
+0

Qu'est-ce qui ne fonctionne pas et que voulez-vous dire par aucun changement? – SQLChao

Répondre

0

DATEADD(week, -5, GETDATE()) sous-titres 30 jours. Vous allez devoir faire un DATEADD manuel pour l'obtenir au début de la semaine, ce qui ressemble à ce que vous essayez de faire. De cette manière, vous pouvez définir vous-même le début de la semaine sans devoir dépendre de la culture du système.

4

Examinez chacune des expressions individuellement. Utilisez Management Studio (ou similaire) pour exécuter ceci:

SELECT DATEADD(week, -1, GETDATE()) 

Et vous verrez quelque chose comme ceci (par rapport au moment où vous l'exécutez):

2017-09-27 15:05:39.453

C'est exactement il y a une semaine , qui était encore un mercredi. Vous voulez dimanche, le commencer de cette semaine. Donc faire maintenant ceci:

SELECT DATEADD(week, DATEDIFF(week, 0, GETDATE()) -1, 0) 

Ce qui vous donne ce résultat:

2017-09-25 00:00:00.000

Closer. Cela fonctionne en prenant le jour 0 et en ajoutant un de moins que le nombre de semaines qui se sont écoulées depuis la semaine de votre date cible. Vous ajoutez des semaines entières, et vous vous retrouvez avec un début de semaine prévisible. Vous obtenez le 25 (lundi) au lieu du 24 parce que le jour 0 (1 janvier 1900) était un lundi. Mais il est fiable un lundi, et maintenant assez facile à expliquer l'un jour:

SELECT DATEADD(DAY, -1, DATEADD(week, DATEDIFF(week, 0, GETDATE()) -1, 0)) 

Et maintenant, nous avons une date que vous pouvez utiliser, d'une expression qui toujours obtenir le droit:

2017-09-24 00:00:00.000

Trier par. Vous devez tester soigneusement comment cela se comporte si vous utilisez Dimanche ou Lundi, d'autant plus que Sql Server dispose d'une valeur de début de semaine configurable. Vous constaterez peut-être que vous avez franchi une ou plusieurs limites de semaine et que vous vous retrouvez avec des erreurs bizarres au cas par cas. Mais même si cela se produit, cette approche vous met sur le chemin dont vous avez besoin pour marcher.

Pour l'autre bout, il suffit de changer le nombre de semaines:

SELECT DATEADD(week, DATEDIFF(week, 0, GETDATE()) -6, 0) 

Pour obtenir:

2017-08-21 00:00:00.000

Depuis la question posée le lundi au lieu du dimanche, nous obtenons sauter le DATEADD() supplémentaire D'avant.

maintenant mettre tous ensemble comme ceci:

WHERE hire_date between 
      DATEADD(week, DATEDIFF(week, 0, GETDATE()) -6, 0) 
     AND 
      DATEADD(DAY, -1, DATEADD(week, DATEDIFF(week, 0, GETDATE()) -1, 0)) 
0

D'après ce que vous dites, je pense que vous avez besoin le premier jour de la semaine plus tôt au dernier jour de la dernière semaine. Pour ce faire, vous pouvez le faire:

WHERE hire_date between DATEADD(week, -6, DATEADD(WEEK, DATEDIFF(wk,0,GETDATE()), 0)) 
and DATEADD(week, -2, DATEADD(WEEK, DATEDIFF(wk,5,GETDATE()), 6)) 
+1

Vous pouvez éliminer l'un des appels de 'DATEADD()' dans chacune des conditions, mais en mettant simplement '-6' et' -2' dans le cadre de l'incrément. –