<?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 SQL Server d&#039;ElSüket &#187; Nouvelles fonctions T-SQL</title>
	<atom:link href="https://blog.developpez.com/elsuket/pcategory/sql-server-2012/nouvelles-fonctions-t-sql/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/elsuket</link>
	<description>Nicolas Souquet - Expert SQL Server</description>
	<lastBuildDate>Mon, 05 Apr 2021 07:32:41 +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>Les nouvelles fonctions T-SQL de SQL Server 2012 &#8211; Episode 2/8 &#8211; FORMAT()</title>
		<link>https://blog.developpez.com/elsuket/p10976/sql-server-2012/sql_server_2012nouvelles_fonctions_forma</link>
		<comments>https://blog.developpez.com/elsuket/p10976/sql-server-2012/sql_server_2012nouvelles_fonctions_forma#comments</comments>
		<pubDate>Tue, 01 May 2012 04:42:11 +0000</pubDate>
		<dc:creator><![CDATA[elsuket]]></dc:creator>
				<category><![CDATA[Nouvelles fonctions T-SQL]]></category>
		<category><![CDATA[SQL Server 2012]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[A l&#8217;épisode précédent, nous avions abordé les possibilités offertes par la nouvelle fonction PARSE(). Poursuivons avec FORMAT(), qui est une extension de CONVERT(), puisqu&#8217;elle est plus ouverte aux différentes cultures &#8230; et beaucoup plus ! Tout d&#8217;abord, la syntaxe : &#8230; <a href="https://blog.developpez.com/elsuket/p10976/sql-server-2012/sql_server_2012nouvelles_fonctions_forma">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>A l&rsquo;<a href="http://blog.developpez.com/elsuket/c3210/sql-server-2012/nouvelles-fonctions-t-sql/">épisode</a> précédent, nous avions abordé les possibilités offertes par la nouvelle fonction <a href="http://blog.developpez.com/elsuket/p10950/sql-server-2012/sql-server-2012-nouvelles-fonctions-pars/">PARSE()</a>.</p>
<p>Poursuivons avec FORMAT(), qui est une extension de CONVERT(), puisqu&rsquo;elle est plus ouverte aux différentes cultures &#8230; et beaucoup plus !<br />
<span id="more-167"></span><br />
Tout d&rsquo;abord, la syntaxe :</p>
<p><code class="codecolorer text default"><span class="text">FORMAT (valeur, format [, culture ])</span></code></p>
<p>Comme avec PARSE() :</p>
<p>&#8211; la nouveauté c&rsquo;est qu&rsquo;on peut formater une valeur suivant une culture (33 cultures disponibles !)<br />
&#8211; les types supportés par cette fonction : bigint, int, smallint, tinyint, decimal, numeric, float, real, smallmoney, money, date, time, datetime, smalldatetime, datetime2 et datetimeoffset.<br />
&#8211; on ne peut pas utiliser PARSE() pour exécuter une requête sur un serveur distant, car celle-ci dépend du .NET Framework 3.5 SP1 , et que rien ne garantit qu&rsquo;il est présent sur la machine distante.</p>
<p>On remarquera que les types de données de chaînes de caractère, comme pour PARSE(), ne sont pas supportés.<br />
Dès lors, on ne peut pas s&rsquo;attendre à pouvoir passer une date au format ISO dans une chaîne de caractères, et que cela fonctionne :</p>
<p><img src="http://blog.developpez.com/media/format_01.PNG" width="551" height="166" alt="" /></p>
<p>=> <strong>Formatage des dates</strong></p>
<p>Commençons avec quelques exemples sur les dates, qui sont généralement assez recherchés.<br />
Voyons sans la culture d&rsquo;abord :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DECLARE @dt date = '20120102' <br />
&nbsp;<br />
SELECT &nbsp;FORMAT(@dt, N'dddd, MMM dd, yyyy') AS anglo_saxon_date_format_0 <br />
&nbsp; , FORMAT(@dt, N'dddd dd MMMM yyyy') AS anglo_saxon_date_format_1 <br />
&nbsp; , FORMAT(@dt, N'dd-MM-yyyy') AS French_numeric_format <br />
&nbsp; , FORMAT(@dt, N'yyyyMMdd') AS ISO_format <br />
&nbsp; , FORMAT(@dt, N'yyyyMMdd HH:mm:ss.000') AS ISO_format_with_time</div></td></tr></tbody></table></div>
<p><img src="http://blog.developpez.com/media/format_02.PNG" width="699" height="241" alt="" /></p>
<p>Et avec la culture :</p>
<p><img src="http://blog.developpez.com/media/format_03.PNG" width="617" height="243" alt="" /></p>
<p>On peut maintenant apprendre les bases d&rsquo;une langue tout en codant <img src="https://blog.developpez.com/elsuket/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>En revanche le formatage composite n&rsquo;est pas directement supporté :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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 /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DECLARE @dt date = '20120102' <br />
&nbsp;<br />
SELECT &nbsp;FORMAT(@dt, N'Nous sommes le dddd dd MMMM yyyy', 'fr-FR')</div></td></tr></tbody></table></div>
<p><img src="http://blog.developpez.com/media/format_04.PNG" width="552" height="187" alt="" /></p>
<p>Attention donc, car les lettres qui correspondent à des parties de date sont automatiquement remplacées, sans qu&rsquo;une erreur ne soit levée.</p>
<p>Essayons d&rsquo;éviter ces lettres :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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 /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DECLARE @dt date = '20120102' <br />
&nbsp;<br />
SELECT &nbsp;FORMAT(@dt, N'Now : dddd dd MMMM yyyy', 'en-US')</div></td></tr></tbody></table></div>
<p><img src="http://blog.developpez.com/media/format_05.PNG" width="504" height="179" alt="" /></p>
<p>Mais il s&rsquo;agit là d&rsquo;un jeu dangereux.<br />
Voyons si on peut les échapper. Est-ce que le classique anti-slash va fonctionner ?</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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 /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DECLARE @dt date = '20120102' <br />
&nbsp;<br />
SELECT &nbsp;FORMAT(@dt, N'Nou\s \so\m\me\s le dddd dd MMMM yyyy', 'fr-FR')</div></td></tr></tbody></table></div>
<p><img src="http://blog.developpez.com/media/format_07.PNG" width="580" height="195" alt="" /></p>
<p>Il faut reconnaître que c&rsquo;est assez tortueux pour ne pas dire <em><a href="http://fr.wikipedia.org/wiki/Programmation_spaghetti">spaghetti</a></em>.<br />
Par extension, on pourra créer une fonction en T-SQL qui effectue automatiquement l’échappement de ces caractères &#8230;</p>
<p>=> <strong>Examinons maintenant les formats raccourcis</strong> :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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 /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DECLARE @dt date = '20120102' <br />
&nbsp;<br />
SELECT &nbsp;FORMAT(@dt, 'D', 'fr-FR') AS weekday_litteral_FR <br />
&nbsp; , FORMAT(@dt, 'D', 'en-US') AS weekday_litteral_US <br />
&nbsp; , FORMAT(@dt, 'd', 'fr-FR') AS decimal_date_FR <br />
&nbsp; , FORMAT(@dt, 'd', 'en-US') AS decimal_date_US <br />
&nbsp; , FORMAT(@dt, 'm', 'fr-FR') AS month_date_litteral_FR <br />
&nbsp; , FORMAT(@dt, 'm', 'en-US') AS month_date_litteral_US <br />
&nbsp; , FORMAT(@dt, 'M', 'fr-FR') AS month_date_litteral_FR_case <br />
&nbsp; , FORMAT(@dt, 'M', 'en-US') AS month_date_litteral_US_case</div></td></tr></tbody></table></div>
<p><img src="http://blog.developpez.com/media/format_08.PNG" width="1100" height="293" alt="" /></p>
<p>Attention donc à la casse dans les formats !<br />
On notera que le zéro non-significatif disparaît au format Français, mais demeure au format Anglo-saxon.</p>
<p>J&rsquo;ai trouvé ceux-ci à tâtons. Voyons les dans leur ensemble :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><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 />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DECLARE @now datetime = GETDATE() <br />
&nbsp; , @amount decimal(6,2) = 1234.56 <br />
&nbsp; , @integer int = 123456 <br />
&nbsp; , @percent decimal(3,2) = 0.76 <br />
&nbsp; , @fr char(5) = 'fr-FR' <br />
&nbsp; , @us char(5) = 'en-US' <br />
&nbsp;<br />
SELECT &nbsp; &nbsp;'Currency 1' AS label, @fr AS culture, 'FORMAT(@amount, ''c'', @fr)' AS sql, FORMAT(@amount, 'c', @fr) AS exemple <br />
UNION ALL &nbsp;SELECT 'Currency 2' AS label, @us AS culture, 'FORMAT(@amount, ''c'', @us)', FORMAT(@amount, 'c', @us) AS exemple <br />
-- <br />
UNION ALL &nbsp;SELECT 'Currency 3', @fr, 'FORMAT(@amount, ''C'', @fr)', FORMAT(@amount, 'C', @fr) <br />
UNION ALL &nbsp;SELECT 'Currency 4', @us, 'FORMAT(@amount, ''C'', @us)', FORMAT(@amount, 'C', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Decimal 1', @fr, 'FORMAT(@integer, ''d'', @fr)', FORMAT(@integer, 'd', @fr) <br />
UNION ALL &nbsp;SELECT 'Decimal 2', @us, 'FORMAT(@integer, ''d'', @us)', FORMAT(@integer, 'd', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Decimal 3', @fr, 'FORMAT(@integer, ''D'', @fr)', FORMAT(@integer, 'D', @fr) <br />
UNION ALL &nbsp;SELECT 'Decimal 4', @us, 'FORMAT(@integer, ''D'', @us)', FORMAT(@integer, 'D', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Decimal 5', @fr, 'FORMAT(@integer, ''D8'', @fr)', FORMAT(@integer, 'D8', @fr) <br />
UNION ALL &nbsp;SELECT 'Decimal 6', @us, 'FORMAT(@integer, ''D8'', @us)', FORMAT(@integer, 'D8', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Full date time, short time 1', @fr, 'FORMAT(@now, ''f'', @fr)', FORMAT(@now, 'f', @fr) <br />
UNION ALL &nbsp;SELECT 'Full date time, short time 2', @us, 'FORMAT(@now, ''f'', @us)', FORMAT(@now, 'f', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Full date time, long time 1', @fr, 'FORMAT(@now, ''F'', @fr)', FORMAT(@now, 'F', @fr) <br />
UNION ALL &nbsp;SELECT 'Full date time, long time 2', @us, 'FORMAT(@now, ''F'', @us)', FORMAT(@now, 'F', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'General date time, short time 1', @fr, 'FORMAT(@now, ''g'', @fr)', FORMAT(@now, 'g', @fr) <br />
UNION ALL &nbsp;SELECT 'General date time, short time 2', @us, 'FORMAT(@now, ''g'', @us)', FORMAT(@now, 'g', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'General date time, long time 1', @fr, 'FORMAT(@now, ''G'', @fr)', FORMAT(@now, 'G', @fr) <br />
UNION ALL &nbsp;SELECT 'General date time, long time 2', @us, 'FORMAT(@now, ''G'', @us)', FORMAT(@now, 'G', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Short time 1', @fr, 'FORMAT(@now, ''t'', @fr)', FORMAT(@now, 't', @fr) <br />
UNION ALL &nbsp;SELECT 'Short time 2', @us, 'FORMAT(@now, ''t'', @us)', FORMAT(@now, 't', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Long time 1', @fr, 'FORMAT(@now, ''T'', @fr)', FORMAT(@now, 'T', @fr) <br />
UNION ALL &nbsp;SELECT 'Long time 2', @us, 'FORMAT(@now, ''T'', @us)', FORMAT(@now, 'T', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Numeric 1', @fr, 'FORMAT(@amount, ''n'', @fr)', FORMAT(@amount, 'n', @fr) <br />
UNION ALL &nbsp;SELECT 'Numeric 2', @us, 'FORMAT(@amount, ''n'', @us)', FORMAT(@amount, 'n', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Numeric 3', @fr, 'FORMAT(@amount, ''N'', @fr)', FORMAT(@amount, 'N', @fr) <br />
UNION ALL &nbsp;SELECT 'Numeric 4', @us, 'FORMAT(@amount, ''N'', @us)', FORMAT(@amount, 'N', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Numeric 5', @fr, 'FORMAT(@amount, ''N0'', @fr)', FORMAT(@amount, 'N0', @fr) <br />
UNION ALL &nbsp;SELECT 'Numeric 6', @us, 'FORMAT(@amount, ''N0'', @us)', FORMAT(@amount, 'N0', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Numeric 7', @fr, 'FORMAT(@amount, ''N1'', @fr)', FORMAT(@amount, 'N1', @fr) <br />
UNION ALL &nbsp;SELECT 'Numeric 8', @us, 'FORMAT(@amount, ''N1'', @us)', FORMAT(@amount, 'N1', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Percentage 1', @fr, 'FORMAT(@percent, ''p'', @fr)', FORMAT(@percent, 'p', @fr) <br />
UNION ALL &nbsp;SELECT 'Percentage 2', @us, 'FORMAT(@percent, ''p'', @us)', FORMAT(@percent, 'p', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Percentage 3', @fr, 'FORMAT(@percent, ''P0'', @fr)', FORMAT(@percent, 'P0', @fr) <br />
UNION ALL &nbsp;SELECT 'Percentage 4', @us, 'FORMAT(@percent, ''P0'', @us)', FORMAT(@percent, 'P0', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Percentage 5', @fr, 'FORMAT(@percent, ''P1'', @fr)', FORMAT(@percent, 'P1', @fr) <br />
UNION ALL &nbsp;SELECT 'Percentage 6', @us, 'FORMAT(@percent, ''P1'', @us)', FORMAT(@percent, 'P1', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Hexadecimal 1', @fr, 'FORMAT(@integer, ''x'', @fr)', FORMAT(@integer, 'x', @fr) <br />
UNION ALL &nbsp;SELECT 'Hexadecimal 2', @us, 'FORMAT(@integer, ''x'', @us)', FORMAT(@integer, 'x', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Hexadecimal 3', @fr, 'FORMAT(@integer, ''X'', @fr)', FORMAT(@integer, 'X', @fr) <br />
UNION ALL &nbsp;SELECT 'Hexadecimal 4', @us, 'FORMAT(@integer, ''X'', @us)', FORMAT(@integer, 'X', @us) <br />
-- <br />
UNION ALL &nbsp;SELECT 'Hexadecimal 5', @fr, 'FORMAT(@integer, ''X10'', @fr)', FORMAT(@integer, 'X10', @fr) <br />
UNION ALL &nbsp;SELECT 'Hexadecimal 6', @us, 'FORMAT(@integer, ''X10'', @us)', FORMAT(@integer, 'X10', @us)</div></td></tr></tbody></table></div>
<p><img src="http://img17.imageshack.us/img17/5430/format12.png" alt="" title="" /></p>
<p>On voit donc que pour le formatage de données :</p>
<p>&#8211; numériques, la casse du format court n&rsquo;a pas d&rsquo;importance<br />
&#8211; numériques, on peut ajouter un chiffre au format court qui indique soit le nombre de décimales, soit la largeur de la mantisse<br />
&#8211; numériques de devise, la culture change bien évidemment le résultat<br />
&#8211; de date, la casse est importante, de même que la culture</p>
<p>=> <strong>Étudions les devises plus en détails</strong> :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT &nbsp;FORMAT(1234.56, 'C', 'en-US') AS US_format <br />
&nbsp; , FORMAT(1234.56, 'C', 'fr-FR') AS French_format <br />
&nbsp; , FORMAT(1234.56, 'C', 'de-DE') AS German_format <br />
&nbsp; , FORMAT(1234.56, 'C', 'en-GB') AS UK_format <br />
&nbsp; , FORMAT(1234.56, 'C', 'sv-SE') AS Swedish_format <br />
&nbsp; , FORMAT(1234.56, 'C', 'th-TH') AS Thai_format <br />
&nbsp; , FORMAT(1234.56, 'C', 'ar-SA') AS Arabic_format</div></td></tr></tbody></table></div>
<p><img src="http://blog.developpez.com/media/format_13.PNG" width="615" height="246" alt="" /></p>
<p>On voit que les formats de devises sont rigoureusement respectés, notamment en ce qui concerne les points et les virgules : les anglo-saxons utilisent la virgule comme séparateur des puissances de 10 multiples de 3, alors que les Latins utilisent le point; et inversement pour les parties décimales.<br />
De même la prise en compte des pays membres de la Zone Euro ont tous leur devise préfixée ou suffixée par le symbole €, alors que le Royaume-Uni et la Suède, qui n&rsquo;en sont pas membres, ont bien évidemment conservé respectivement les symboles de la Livre Sterling et de la Couronne Suédoise.</p>
<p>Une petite remarque : en Arabe, la notation retournée par SQL Server n&rsquo;est strictement identique à ce que l&rsquo;on observe rien qu&rsquo;en collant cette valeur de fenêtre de résultats dans la fenêtre de requêtes de <em>SQL Server Management Studio</em> :</p>
<p><img src="http://blog.developpez.com/media/format_09.PNG" width="452" height="54" alt="" /></p>
<p>J&rsquo;ai essayé de faire traduire automatiquement par <em>Google Translate</em>, mais le résultat retourné est <em>R.. Q. 1,234.56</em>.<br />
Si vous pouvez expliquer ce qui s&rsquo;est passé, n&rsquo;hésitez pas à poster un commentaire !</p>
<p>=> <strong>Les masques pour les valeurs numériques</strong></p>
<p>Les masques permettent de spécifier le nombre de décimales pour une valeur numérique, et si l&rsquo;on en a besoin, d&rsquo;ajouter des symboles dans la valeur formatée à l&rsquo;aide de la position :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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 /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DECLARE @uneValeur decimal(6,2) = 1234.56 <br />
&nbsp;<br />
SELECT &nbsp;FORMAT(@uneValeur, '##,##0.00') AS exemple_1 <br />
&nbsp; , FORMAT(@uneValeur, '#,##0.00') AS exemple_2 <br />
&nbsp; , FORMAT(@uneValeur, '#,#0.00') AS exemple_3 <br />
&nbsp; , FORMAT(@uneValeur, '#,#0.0') AS exemple_4 <br />
&nbsp; , FORMAT(@uneValeur, '#,#0') AS exemple_5 <br />
&nbsp; , FORMAT(@uneValeur, '#0') AS exemple_6 <br />
&nbsp; , FORMAT(@uneValeur, '#0.0') AS exemple_7 <br />
&nbsp; , FORMAT(@uneValeur, '#0.00') AS exemple_8 <br />
&nbsp; , FORMAT(@uneValeur, '#0.000') AS exemple_9 <br />
&nbsp; , FORMAT(@uneValeur, '#|#0.000') AS exemple_10 <br />
&nbsp; , FORMAT(@uneValeur, '#\#0.000') AS exemple_11</div></td></tr></tbody></table></div>
<p><img src="http://blog.developpez.com/media/format_14.PNG" width="817" height="341" alt="" /></p>
<p>Dans les colonnes exemple_2 et exemple_10, on a respectivement placé :</p>
<p>&#8211; une virgule avant les trois derniers chiffres de la partie entière de la valeur décimale<br />
&#8211; un pipe avant les deux derniers chiffres de la partie entière de la valeur décimale</p>
<p>Dans la colonne exemple_11, l&rsquo;antislash étant un caractère d&rsquo;échappement, il y a donc un symbole <em>dièse</em> qui sera intercalé entre le dernier et l&rsquo;avant-dernier chiffre de la partie entière de la valeur décimale.</p>
<p>De la même façon que ce que nous avons vu avec les formats courts, on peut aussi préciser le nombre de chiffres significatifs de la partie décimale d&rsquo;une telle valeur.<br />
Si le nombre de chiffres significatifs de la partie décimale :</p>
<p>&#8211; est plus petit que celui de la valeur passée en paramètre, alors la valeur formatée est arrondie<br />
&#8211; est plus grand que celui de la valeur passée en paramètre, alors la valeur formatée est suivie d&rsquo;autant de zéros que la différence entre le nombre de chiffres significatifs de la partie décimale et le nombre de chiffres de la partie décimale du masque de formatage.</p>
<p>Bon FORMATage de données à tous !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les nouvelles fonctions T-SQL de SQL Server 2012 &#8211; Episode 1/8 &#8211; PARSE() &#8211;</title>
		<link>https://blog.developpez.com/elsuket/p10950/t-sql/sql_server_2012_nouvelles_fonctions_pars</link>
		<comments>https://blog.developpez.com/elsuket/p10950/t-sql/sql_server_2012_nouvelles_fonctions_pars#comments</comments>
		<pubDate>Mon, 16 Apr 2012 12:18:57 +0000</pubDate>
		<dc:creator><![CDATA[elsuket]]></dc:creator>
				<category><![CDATA[Nouvelles fonctions T-SQL]]></category>
		<category><![CDATA[SQL Server 2012]]></category>
		<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je vous propose de découvrir les 14 nouvelles fonctions que SQL Server 2012 introduit, en dédiant un billet soit à chacune d&#8217;entre-elles, ou bien à un groupe d&#8217;entre-elles. Commençons avec la fonction PARSE() &#8230; La syntaxe d&#8217;utilisation de cette fonction &#8230; <a href="https://blog.developpez.com/elsuket/p10950/t-sql/sql_server_2012_nouvelles_fonctions_pars">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Je vous propose de découvrir les 14 nouvelles fonctions que SQL Server 2012 introduit, en dédiant un billet soit à chacune d&rsquo;entre-elles, ou bien à un groupe d&rsquo;entre-elles.</p>
<p>Commençons avec la fonction PARSE() &#8230;<br />
<span id="more-165"></span><br />
La syntaxe d&rsquo;utilisation de cette fonction est la suivante :</p>
<p><code class="codecolorer text default"><span class="text">PARSE('&lt;uneValeur&gt;' AS &lt;data_type&gt; [USING '&lt;culture&gt;'])</span></code></p>
<p>La nouveauté c&rsquo;est la possibilité de formater une valeur suivant une culture, et ce n&rsquo;est pas moins de 33 cultures qui sont disponibles !<br />
De façon générale, cette fonction est une extension de ce que l&rsquo;on peut faire avec CONVERT().<br />
Rappelons dans les deux cas qu&rsquo;il s&rsquo;agit de fonctions de formatage de données.</p>
<p>On notera que :</p>
<p>&#8211; <em>data_type</em> est limité aux types suivants : bigint, int, smallint, tinyint, decimal, numeric, float, real, smallmoney, money, date, time, datetime, smalldatetime, datetime2 et datetimeoffset.</p>
<p>&#8211; On ne peut pas utiliser PARSE() pour exécuter une requête sur un serveur distant, car celle-ci dépend du .NET Framework 3.5 SP1 , et que rien ne garantit qu&rsquo;il est présent sur la machine distante.</p>
<p>Faisons quelques essais !</p>
<p><code class="codecolorer text default"><span class="text">SELECT PARSE ('100.000' AS int)</span></code></p>
<p><img src="http://blog.developpez.com/media/parse_01.PNG" width="469" height="153" alt="" /></p>
<p>Alors qu&rsquo;un <code class="codecolorer text default"><span class="text">SELECT CONVERT(int, '100.000')</span></code> :</p>
<p><img src="http://blog.developpez.com/media/parse_02.png" width="625" height="167" alt="" /></p>
<p>Essayons un <code class="codecolorer text default"><span class="text">SELECT PARSE('Lundi 16 Avril 2012' AS datetime USING 'fr-FR')</span></code></p>
<p><img src="http://blog.developpez.com/media/parse_03.PNG" width="528" height="154" alt="" /></p>
<p>Voyons au format Anglo-Saxon : <code class="codecolorer text default"><span class="text">SELECT PARSE('Monday 16 April 2012' AS datetime USING 'en-US')</span></code></p>
<p><img src="http://blog.developpez.com/media/parse_04.PNG" width="527" height="168" alt="" /></p>
<p>Quid du format que l&rsquo;on nous a donné à l&rsquo;école ? <code class="codecolorer text default"><span class="text">SELECT PARSE('Monday, April 16 2012' AS datetime USING 'en-US')</span></code></p>
<p><img src="http://blog.developpez.com/media/parse_05.png" width="529" height="162" alt="" /></p>
<p>En revanche <code class="codecolorer text default"><span class="text">SELECT PARSE('Monday, April 16th 2012' AS datetime USING 'en-US')</span></code></p>
<p><img src="http://blog.developpez.com/media/parse_06.PNG" width="751" height="155" alt="" /></p>
<p>Essayons <code class="codecolorer text default"><span class="text">SELECT PARSE('April, 16 2012' AS datetime USING 'en-US')</span></code></p>
<p><img src="http://blog.developpez.com/media/parse_07.png" width="517" height="164" alt="" /></p>
<p>Voyons avec une date du calendrier Grégo-Thaï : en effet, le calendrier Grégo-Thaï à 543 ans d&rsquo;avance sur le calendrier Grégorien :<br />
<code class="codecolorer text default"><span class="text">SELECT PARSE(N'16 &amp;#3648;&amp;#3617;&amp;#3625;&amp;#3634;&amp;#3618;&amp;#3609; 2555' AS datetime USING 'Th-TH')</span></code></p>
<p><img src="http://blog.developpez.com/media/parse_08.PNG" width="516" height="158" alt="" /></p>
<p>Et avec des variables ?</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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 /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DECLARE @date_string char(20) = 'Lundi 16 Avril 2012' <br />
&nbsp; , @culture char(5) = 'fr-FR' <br />
&nbsp;<br />
SELECT PARSE(@date_string AS datetime USING @culture)</div></td></tr></tbody></table></div>
<p><img src="http://blog.developpez.com/media/parse_09.PNG" width="524" height="216" alt="" /></p>
<p>Et dans une table :</p>
<div class="codecolorer-container text vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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 /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">CREATE TABLE test_PARSE <br />
( <br />
&nbsp; date_string nvarchar(20) <br />
&nbsp; , culture char(5) <br />
&nbsp; , formatted_date AS (PARSE(date_string AS datetime USING culture)) <br />
) <br />
GO <br />
&nbsp;<br />
INSERT &nbsp;INTO dbo.test_PARSE <br />
VALUES &nbsp;(N'Lundi 16 Avril 2012', 'fr-FR'), (N'16 &amp;#3648;&amp;#3617;&amp;#3625;&amp;#3634;&amp;#3618;&amp;#3609; 2555', 'th-TH') <br />
GO <br />
&nbsp;<br />
SELECT &nbsp;* <br />
FROM &nbsp;dbo.test_PARSE</div></td></tr></tbody></table></div>
<p><img src="http://blog.developpez.com/media/parse_10.PNG" width="597" height="376" alt="" /></p>
<p>Vous vous demandez s&rsquo;il sera possible de retourner une valeur décimale avec le symbole de la devise suivant une culture ? la réponse est oui : avec la fonction FORMAT(), que nous verrons au prochain épisode <img src="https://blog.developpez.com/elsuket/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p>Bon formatage de données !</p>
<p>ElSüket</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>
