2009-11-13 7 views
2

Est-ce que quelqu'un pourrait m'expliquer cela parce que je suis un peu confus quant à la raison pour laquelle cela se produit? Fondamentalement ce que je voudrais savoir est pourquoi il y a une différence entre la date du dimanche et tous les autres jours de cette semaine dans les semaines de l'année 0. Si cela a du sens!DateDiff SQL Server Problème

J'ai essayé de régler la date en premier mais cela n'a eu aucun effet. Sûrement lundi - dimanche de cette semaine devraient tous avoir la même différence dans les semaines à partir de l'année zéro?

Set Datefirst 1 
Select DateName(dw,0) --Monday 
Select DateDiff(week, 0, '20091109')--Monday: Difference 5732 
Select DateDiff(week, 0, '20091114')--Saturday: Difference 5732 
Select DateDiff(week, 0, '20091115')--Sunday: Difference 5733 

Ce qui est encore plus bizarre est que si vous prenez les deux mêmes dates et la date que vous obtenez les diff une semaine pour les 6 jours et un pour l'autre. Est-ce que j'ai râté quelque chose?

Select DateDiff(dd,'20091109','20091115')--6 Days difference 
Select DateDiff(ww,'20091109','20091115')--1 Week difference 

J'utilise SQL Server 2005

Répondre

3

dimanche est considéré comme le premier jour de la semaine dans un certain nombre de pays.

+0

Je pense que vous êtes sur quelque chose ... Sélectionnez DateDiff (wk, '20091108', '20091114') renvoie 0. – Mayo

+0

C'est exactement la raison. SQL Server considère la semaine du calendrier du dimanche au samedi dans la plupart des configurations. – BBlake

+2

En tant qu'addendum, vous pouvez définir quel jour de la semaine SQL Server considère être le premier jour de la semaine avec une commande SET DATEFIRST. suivi d'un 1 (lundi) à 7 (dimanche). Dans l'installation par défaut, il s'agit d'un 7 (dimanche) – BBlake

2

Je pense que le problème auquel vous faites face est celui des dates limites. Sont-ils inclusifs?

Select DateDiff(dd,'20091109','20091115')--6 Days difference 
Select DateDiff(dd,'20091109','20091116')--7 Days difference 

DateDiff - Retourne le nombre de limites de date et d'heure croisés entre deux dates spécifiées. (Livres en ligne Définition)

3

Toutes les fonctions de datediff font est de compter le nombre de la date boundarys entre les deux arguments datetime qui lui sont transmises. Donc, si une semaine est définie pour commencer dimanche, alors la semaine limite est minuit dimanche matin.

Ainsi, à partir 11h59 samedi soir à 00h01 dimanche matin, sera le même datediff(week, x, y) à partir de 00h01 dimanche à 23h59 samedi soir - 13 jours plus tard.

x ------------------------------x ==> 1 week diff 
| Su M T W T F S | Su M T W T F S | 
|    |    | 
       x-x     ==> Also 1 week diff 
1

Si vous définissez le nombre DATEFIRST = 1, lundi est le premier jour de la semaine, et les calculs de la semaine utiliserait MOD 7 pour le nombre de jours dans la semaine et/7 pour la semaine, où dimanche serait utilisé comme 1, et les autres FLOORed à 0.