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

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

Cet article contient des exemples de conversion d'une heure valeur à un datetimeoffset valeur dans SQL Server à l'aide de Transact-SQL.

Lorsque vous convertissez une heure valeur à datetimeoffset , la date est réglée sur « 1900-01-01 » et l'heure est copiée. Un décalage de fuseau horaire est ajouté et défini sur +00:00.

Exemple 1 - 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 à partir de temps à datetimeoffset .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset) AS 'datetimeoffset';

Résultat :

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1234567 +00:00 |
+------------------+------------------------------------+

Ainsi, une partie de date est ajoutée et définie sur "1900-01-01", l'heure est copiée et un décalage de fuseau horaire est ajouté et défini sur +00:00.

Exemple 2 – Précision

Dans l'exemple précédent, les deux types de données utilisent leur précision/échelle par défaut (7). C'est parce que je n'ai pas ajouté d'échelle entre parenthèses (l'échelle détermine la précision en fractions de seconde). En utilisant une échelle de 7, nous pouvons voir que les deux types de données sont capables de représenter une valeur temporelle précise à 7 décimales près.

En d'autres termes, lorsque j'ai initialement défini le @thetime variable, j'ai inclus 7 décimales dans la valeur (en particulier, 1234567 ). Les types de données "time" et "datetimeoffset" ont réussi à les représenter car ils utilisaient tous deux une échelle de 7. Encore une fois, nous savons qu'ils ont utilisé 7 car c'est la valeur par défaut.

Juste pour être clair, échelle est le nombre de chiffres à droite de la virgule décimale dans un nombre. Précision est le nombre total de chiffres du nombre.

Nous pouvons réduire la précision des fractions de seconde si nécessaire.

Voici quelques exemples qui illustrent ce qui se passe lorsque les types de données sont définis pour utiliser une précision fractionnaire de seconde différente :

DECLARE @thetime time(7);
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset(0)) AS 'datetimeoffset';

Résultat :

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.0000000 +00:00 |
+------------------+------------------------------------+

Dans ce cas, j'ai défini explicitement le @thetime variable pour utiliser une échelle de 7. Mais quand je transcris ceci à datetimeoffset , j'ai mis l'échelle à 0. Par conséquent, le résultat pour le datetimeoffset la valeur est moins précise en fractions de seconde. Sur mon système, 7 décimales sont toujours affichées, mais elles sont toutes à 0.

Le voici à nouveau, mais cette fois j'augmente la précision des fractions de secondes à 3 pour le datetimeoffset valeur :

DECLARE @thetime time(7);
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset(3)) AS 'datetimeoffset';

Résultat :

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1230000 +00:00 |
+------------------+------------------------------------+

Il utilise donc les 3 premières secondes fractionnaires (millisecondes).

Cependant, si nous augmentons la précision des fractions de seconde à 4, regardez ce qui se passe :

DECLARE @thetime time(7);
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset(4)) AS 'datetimeoffset';

Résultat :

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1235000 +00:00 |
+------------------+------------------------------------+

Dans l'exemple suivant, j'augmente la valeur de la partie fractionnaire afin qu'elle provoque la partie non fractionnaire du datetimeoffset valeur à arrondir :

DECLARE @thetime time(7);
SET @thetime = '23:15:59.7654321';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset(0)) AS 'datetimeoffset';

Résultat :

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.7654321 | 1900-01-01 23:16:00.0000000 +00:00 |
+------------------+------------------------------------+

Dans ce cas, les minutes ont été arrondies et les secondes mises à zéro.

Échangeons-le pour que le datetimeoffset a une précision plus élevée que le temps valeur :

DECLARE @thetime time(4);
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetimeoffset(7)) AS 'datetimeoffset';

Résultat :

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1235000 | 1900-01-01 23:15:59.1235000 +00:00 |
+------------------+------------------------------------+

J'ai déclaré le @thetime variable pour utiliser une échelle de 4, mais a ensuite utilisé une échelle de 7 lors de sa conversion en datetimeoffset Type de données. L'utilisation d'une précision de 7 n'est pas nécessaire, car elle ne peut pas utiliser une précision supérieure à celle qui a déjà été attribuée.

En outre, tout arrondi de précision inférieure s'est déjà produit au moment où il est converti en datetimeoffset (précision plus élevée). Type de données. Notez que le temps Le type de données a arrondi les fractions de seconde à partir de la valeur initiale que je lui ai attribuée. Cet effet d'arrondi s'est également répercuté sur le datetimeoffset valeur.

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

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

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CONVERT(datetimeoffset, @thetime) AS 'datetimeoffset';

Résultat :

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1234567 +00:00 |
+------------------+------------------------------------+

Exemple 4 – Conversion implicite

Voici un exemple de faire la même chose, mais en utilisant une conversion de type implicite.

DECLARE @thetime time, @thedatetimeoffset datetimeoffset;
SET @thetime = '23:15:59.1234567';
SET @thedatetimeoffset = @thetime;
SELECT 
  @thetime AS 'time',
  @thedatetimeoffset AS 'datetimeoffset';

Résultat :

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 1900-01-01 23:15:59.1234567 +00:00 |
+------------------+------------------------------------+

Nous obtenons donc le même résultat, qu'il s'agisse d'une conversion explicite ou implicite.

Il s'agit d'une conversion implicite car nous n'utilisons pas de fonction de conversion pour la convertir explicitement. Nous attribuons simplement la valeur d'une variable d'un type de données à une variable d'un autre type de données. Dans ce cas, SQL Server effectue une conversion implicite dans les coulisses lorsque nous essayons d'attribuer l'heure valeur à un datetimeoffset variables.

Exemple 5 - Modifier la date

Si vous devez changer la date (mais garder la même heure), vous pouvez utiliser le DATEADD() une fonction.

DECLARE @thetime time, @thedatetimeoffset datetimeoffset;
SET @thetime = '23:15:59.1234567';
SET @thedatetimeoffset = @thetime;
SET @thedatetimeoffset = DATEADD(year, 285, @thedatetimeoffset);
SELECT 
  @thetime AS 'time',
  @thedatetimeoffset AS 'datetimeoffset';

Résultat :

+------------------+------------------------------------+
| time             | datetimeoffset                     |
|------------------+------------------------------------|
| 23:15:59.1234567 | 2185-01-01 23:15:59.1234567 +00:00 |
+------------------+------------------------------------+

Dans ce cas, j'ajoute 285 à la valeur de l'année, ce qui l'amène à 2185.