<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog de Kropernic &#187; T-SQL</title>
	<atom:link href="https://blog.developpez.com/kropernic/category/t-sql/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/kropernic</link>
	<description></description>
	<lastBuildDate>Tue, 15 Jul 2014 08:43:13 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>T-SQL : Récupérer le numéro de semaine d&#8217;une date</title>
		<link>https://blog.developpez.com/kropernic/2013/09/25/t-sql-recuperer-le-numero-de-semaine-dune-date/</link>
		<comments>https://blog.developpez.com/kropernic/2013/09/25/t-sql-recuperer-le-numero-de-semaine-dune-date/#comments</comments>
		<pubDate>Wed, 25 Sep 2013 13:23:26 +0000</pubDate>
		<dc:creator><![CDATA[Kropernic]]></dc:creator>
				<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/kropernic/?p=66</guid>
		<description><![CDATA[Trouver le numéro de la semaine d&#8217;une date donnée est un besoin qui revient régulièrement lorsque l&#8217;on en vient à gérer des données temporelles. Si au premier abord cela semble trivial, la fonction DATEPART pourrait bien vous réserver quelques surprises si vous n&#8217;y prenez pas garde (comme cela a été mon cas aujourd&#8217;hui). Il ne s&#8217;agit pas ici de faire un descriptif détaillé de la fonction DATEPART. Pour cela, il y a la MSDN. Intéressons-nous [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Trouver le numéro de la semaine d&rsquo;une date donnée est un besoin qui revient régulièrement lorsque l&rsquo;on en vient à gérer des données temporelles.  Si au premier abord cela semble trivial, la fonction DATEPART pourrait bien vous réserver quelques surprises si vous n&rsquo;y prenez pas garde (comme cela a été mon cas aujourd&rsquo;hui).<br />
<span id="more-66"></span><br />
Il ne s&rsquo;agit pas ici de faire un descriptif détaillé de la fonction DATEPART.  Pour cela, il y a la <a href="http://msdn.microsoft.com/en-us/library/ms174420.aspx" title="MSDN" target="_blank">MSDN</a>.</p>
<p>Intéressons-nous donc à l&rsquo;argument WEEK.  Comme on peut s&rsquo;y attendre, l&rsquo;utilisation de cette argument nous renvoi un numéro de semaine.  Mais déjà un piège pointe le bout de son nez.<br />
Selon la MSDN :</p>
<blockquote><p>When datepart is week (wk, ww) or weekday (dw), the return value depends on the value that is set by using SET DATEFIRST. </p></blockquote>
<p>Traduction :</p>
<blockquote><p>Lorsque le paramètre est week (wk, ww) ou weekday (dw), le résultat dépend de la valeur définie par l&rsquo;instruction SET DATEFIRST.</p></blockquote>
<p>En effet, SET DATEFIRST permet de signaler à SQL SERVER quel est le premier jour d&rsquo;une semaine.</p>
<p>En pratique, qu&rsquo;est-ce que cela signifie ?</p>
<p>Voyons un cas concret.  Pour nous faciliter la vie, créons une table de dates toute simple dont voici le code DDL ainsi que le code d&rsquo;insertion de quelques lignes :</p>
<div class="codecolorer-container sql mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> T_DATE_DAT<span style="color: #66cc66;">&#40;</span><br />
&nbsp; &nbsp; DAT_DATE <span style="color: #993333; font-weight: bold;">DATE</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><br />
<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">GO</span><br />
<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> T_DATE_DAT<br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">VALUES</span>&nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'20120101'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'20120102'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'20120103'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'20120104'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'20120105'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'20120106'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'20120107'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'20120108'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'20120109'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'20120110'</span><span style="color: #66cc66;">&#41;</span></div></td></tr></tbody></table></div>
<p>Sur base de ceci, nous pouvons maintenant faire quelques tests.  Par défaut, le premier jour d&rsquo;une semaine pour SQL SERVER est le dimanche.<br />
Exécutons alors la requête suivante :</p>
<div class="codecolorer-container sql mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; DAT_DATE<span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; DATEPART<span style="color: #66cc66;">&#40;</span>WEEK<span style="color: #66cc66;">,</span>DAT_DATE<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">'WEEK'</span><br />
<span style="color: #993333; font-weight: bold;">FROM</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; T_DATE_DAT</div></td></tr></tbody></table></div>
<p>Vous devriez obtenir comme résultat que la première semaine de 2012 va du 1 Janvier au 7 Janvier.  Le premier étant un dimanche et le 7 un samedi.  </p>
<p>Ce n&rsquo;est pas vraiment ce nous attentions n&rsquo;est-ce pas ?</p>
<p>Signalons maintenant à SQL SERVER que le premier jour d&rsquo;une semaine est le lundi et exécutons à nouveau cette requête.</p>
<div class="codecolorer-container sql mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SET</span> DATEFIRST <span style="color: #cc66cc;">1</span>;<br />
<br />
<span style="color: #993333; font-weight: bold;">SELECT</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; DAT_DATE<span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; DATEPART<span style="color: #66cc66;">&#40;</span>WEEK<span style="color: #66cc66;">,</span>DAT_DATE<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">'WEEK'</span><br />
<span style="color: #993333; font-weight: bold;">FROM</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; T_DATE_DAT</div></td></tr></tbody></table></div>
<p>A présent, nos semaines commencent bien le lundi.  C&rsquo;est déjà un net progrès !  Cependant, si je regarde un calendrier sur lequel sont notés les numéros des semaines, je constate que la première semaine de 2012 commence en fait le 2 Janvier !  Cela s&rsquo;explique par le fait que la première semaine d&rsquo;une année est la semaine comprenant le premier jeudi de la-dite année.  La première semaine de 2012 est donc bien la semaine allant du 2 Janvier au 8 Janvier.<br />
N.B. : Cette numérotation n&rsquo;est principalement utilisée qu&rsquo;en Europe.</p>
<p>Et c&rsquo;est là qu&rsquo;est le piège.  S&rsquo;il est normal d&rsquo;avoir des années de 53 semaines, l&rsquo;utilisation de la fonction DATEPART avec l&rsquo;argument WEEK vous retourna des semaines avec un numéro 54.</p>
<p>Mais alors comment faire pour récupérer le bon numéro de semaine avec la fonction DATEPART.  Et bien tout simplement en n&rsquo;utilisant pas l&rsquo;argument WEEK mais ISOWK.  Et oui, il fallait le savoir, il y a un argument pour récupérer le numéro de la semaine au format ISO.</p>
<p>Remplaçons donc le paramètre WEEK par ISOWK dans notre requête.  Cela donne donc la requête suivante :</p>
<div class="codecolorer-container sql mac-classic" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; DAT_DATE<span style="color: #66cc66;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; DATEPART<span style="color: #66cc66;">&#40;</span>ISOWK<span style="color: #66cc66;">,</span>DAT_DATE<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">'ISO WEEK'</span><br />
<span style="color: #993333; font-weight: bold;">FROM</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; T_DATE_DAT</div></td></tr></tbody></table></div>
<p>Et nous récupérons maintenant les numéros de semaines correctes tels que nous les retrouvons sur tous calendriers (européens) qui se respecte.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
