Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

N'oubliez pas ceci lors du formatage d'un type de données TIME dans SQL Server (T-SQL)

Dans SQL Server, lorsque vous utilisez le T-SQL FORMAT() fonction pour formater une heure type de données, vous devez vous rappeler d'échapper les deux-points ou les points dans votre chaîne de format.

En effet, le FORMAT() La fonction s'appuie sur les règles de formatage CLR, qui dictent que les deux-points et les points doivent être échappés. Par conséquent, lorsque la chaîne de format (deuxième paramètre) contient un deux-points ou un point, les deux-points ou le point doivent être échappés avec une barre oblique inverse lorsqu'une valeur d'entrée (premier paramètre) est de l'heure Type de données.

Exemple 1 - Échapper à un côlon

Voici un exemple basique d'utilisation du FORMAT() fonction pour formater une heure type de données.

SELECT FORMAT(CAST('11:28:15' AS time), 'hh\:mm') Result;

Résultat :

+----------+
| Result   |
|----------|
| 11:28    |
+----------+

Notez la barre oblique inverse dans la chaîne de format.

Exemple 2 - Échapper à une période

La même chose s'applique si nous voulons le formater avec un point :

SELECT FORMAT(CAST('11:28:15' AS time), 'hh\.mm') Result;

Résultat :

+----------+
| Result   |
|----------|
| 11.28    |
+----------+

Exemple 3 – Sans échappement

Voici ce qui se passe si nous n'échappons pas au côlon ou aux règles.

SELECT 
  FORMAT(CAST('11:28:15' AS time), 'hh:mm') 'Unescaped Colon',
  FORMAT(CAST('11:28:15' AS time), 'hh.mm') 'Unescaped Period';

Résultat :

+-------------------+--------------------+
| Unescaped Colon   | Unescaped Period   |
|-------------------+--------------------|
| NULL              | NULL               |
+-------------------+--------------------+

Nous obtenons NULL dans les deux cas.

Exemple 4 - Datetime (pas besoin d'échapper)

Vous n'avez besoin d'échapper les deux-points et le point que si la valeur d'entrée est de type de données heure . Si c'est datetime (ou datetime2 etc), vous n'avez pas besoin de leur échapper.

Si j'utilise l'exemple précédent, mais changez les valeurs d'entrée en datetime2 , nous obtenons le résultat souhaité sans avoir besoin d'échapper quoi que ce soit :

SELECT 
  FORMAT(CAST('11:28:15' AS datetime2), 'hh:mm') 'Unescaped Colon',
  FORMAT(CAST('11:28:15' AS datetime2), 'hh.mm') 'Unescaped Period';

Résultat :

+-------------------+--------------------+
| Unescaped Colon   | Unescaped Period   |
|-------------------+--------------------|
| 11:28             | 11.28              |
+-------------------+--------------------+

Il en va de même pour sysdatetime :

SELECT 
  FORMAT(SYSDATETIME(), 'hh:mm') 'Unescaped Colon',
  FORMAT(SYSDATETIME(), 'hh.mm') 'Unescaped Period';

Résultat :

+-------------------+--------------------+
| Unescaped Colon   | Unescaped Period   |
|-------------------+--------------------|
| 04:46             | 04.46              |
+-------------------+--------------------+