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

Convertir 'smalldatetime' en 'time' dans SQL Server (exemples T-SQL)

Cet article contient des exemples de conversion d'un smalldatetime valeur à un temps valeur dans SQL Server.

Lorsque vous convertissez un smalldatetime valeur au temps , vous perdez la date. Les heures, les minutes et les secondes sont copiées. Les fractions de seconde sont mises à 0.

Le petitedateheure le type de données comprend à la fois la date et l'heure. Cependant, l'heure n'a pas de fraction de seconde et sa composante secondes est toujours définie sur zéro (:00). Sa précision est à la minute près. Sa taille de stockage est de 4 octets.

Le temps type de données, d'autre part, n'inclut que l'heure. Cependant, il vous permet de spécifier une précision fractionnaire de seconde de 0 à 7. Ceci est réalisé en utilisant le time(n ) syntaxe, où n est l'échelle de 0 à 7. Si vous ne le spécifiez pas, il utilisera 7 (valeur par défaut), qui fournit une précision de 100 nanosecondes. Si vous spécifiez zéro (0 ), sa précision sera à la seconde près. Sa taille de stockage sera de 3, 4 ou 5 octets (plus 1 octet pour stocker la précision), en fonction de la précision en fractions de secondes.

Exemple 1 – Conversion implicite

Voici un exemple de conversion implicite entre datetime et temps .

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Résultat :

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 10:16:00 |
+---------------------+----------+

Il s'agit d'une conversion implicite car nous n'utilisons pas de fonction de conversion (comme celles ci-dessous) pour la convertir explicitement. Dans ce cas, SQL Server effectue une conversion implicite dans les coulisses lorsque nous essayons d'attribuer le smalldatetime valeur à un temps variables.

La chose la plus évidente à propos de ce résultat est que le temps la valeur n'inclut pas la date. Il faut s'y attendre, car le temps Le type de données sert uniquement à stocker des valeurs de temps, pas des valeurs de date.

Ce qui n'est pas évident (au moins avec mon exemple) est que la valeur de temps peut en fait gérer une fraction de seconde. Mon système n'affiche pas les fractions de seconde ici, mais l'exemple suivant montrera qu'il a en fait une précision fractionnaire de 7.

De plus, si vous regardez attentivement, vous verrez que le smalldatetime valeur arrondie aux minutes à partir de la valeur réelle que j'essayais de lui attribuer. Cela reflète la précision relativement faible de la smalldatetime Type de données. Sa précision est à la minute près. La conséquence évidente de cela est que lorsque nous réattribuons finalement sa valeur au temps type de données, c'est la valeur arrondie qui est attribuée - pas la valeur initiale que j'ai essayé d'attribuer. Si nous avions attribué la valeur initiale directement au temps variable, nous aurions obtenu une valeur plus précise (même si nous avions spécifié une échelle de 0).

Voici ce que je veux dire :

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Résultat :

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 10:15:30 |
+---------------------+----------+

Exemple 2 – Ajouter des fractions de seconde

Le petitedateheure le type de données n'a pas de fraction de seconde, mais dans notre premier exemple, le temps value a une précision fractionnaire de 7 (même si elle n'affiche pas réellement de décimales). Je connais sa précision car je n'ai pas spécifié d'échelle lors de sa déclaration, il utilise donc son échelle par défaut de 7.

Voici un exemple pour confirmer que le temps value peut en fait supporter une partie fractionnaire :

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'Original time',
  DATEADD(nanosecond, 123456700, @thetime) AS 'Modified time';

Résultat :

+---------------------+-----------------+------------------+
| smalldatetime       | Original time   | Modified time    |
|---------------------+-----------------+------------------|
| 2025-05-21 10:16:00 | 10:16:00        | 10:16:00.1234567 |
+---------------------+-----------------+------------------+

Notez que lorsque le temps valeur a une échelle de 7, elle a une taille de stockage de 5 octets. Par conséquent, il a des exigences de stockage plus élevées que le smalldatetime type (qui n'utilise que 4 octets).

Exemple 3 - Conversion explicite à l'aide de CAST()

Voici un exemple de conversion explicite. Dans ce cas, j'utilise le CAST() fonction directement dans le SELECT déclaration pour convertir explicitement entre smalldatetime et temps .

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CAST(@thesmalldatetime AS time(0)) AS 'time(0)';

Résultat :

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16:00  |
+---------------------+-----------+

Dans cet exemple, j'ai mis l'échelle à 0.

Exemple 4 - Conversion explicite à l'aide de CONVERT()

Voici un exemple de conversion explicite utilisant le CONVERT() fonction au lieu de CAST() .

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CONVERT(time(0), @thesmalldatetime) AS 'time(0)';

Résultat :

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16:00  |
+---------------------+-----------+