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

Exemples de conversion de 'date' en 'datetimeoffset' dans SQL Server (T-SQL)

Cet article contient des exemples de conversion d'une date valeur à un datetimeoffset valeur dans SQL Server.

Lorsque vous convertissez une date valeur à datetimeoffset , des informations supplémentaires sont ajoutées à la valeur. C'est parce que le datetimeoffset Le type de données contient à la fois des informations de date et d'heure, ainsi que des informations de décalage horaire. En d'autres termes, le datetimeoffset Le type de données définit une date combinée à une heure de la journée qui tient compte du fuseau horaire et est basée sur une horloge de 24 heures. La date Le type de données, en revanche, ne contient que des informations de date.

Lorsque nous convertissons à partir de la date à datetimeoffset , l'heure (et le décalage horaire) est automatiquement ajoutée à la valeur. Cependant, vous pouvez toujours modifier la valeur si nécessaire (y compris le décalage horaire).

Le datetimeoffset Le type de données vous permet également de spécifier la précision en fractions de seconde. Si vous ne le spécifiez pas, il utilise une échelle de 7. Cela signifie qu'il inclura 7 chiffres à droite de la virgule décimale.

Exemple 1 – Conversion implicite

Voici un exemple de conversion implicite entre date et datetimeoffset .

DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7)
SET @thedate = '2020-12-01'
SET @thedatetimeoffset = @thedate
SELECT 
  @thedate AS 'date',
  @thedatetimeoffset AS 'datetimeoffset';

Résultat :

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +00: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 la date valeur à un datetimeoffset variables.

Nous pouvons voir que la date la variable ne contient que des informations de date, alors que le datetimeoffset La variable contient des informations de décalage de date, d'heure et de fuseau horaire.

Lorsque vous convertissez entre date et datetimeoffset(7) (c'est-à-dire en utilisant une échelle de 7), la composante temporelle est définie sur 00:00:00.0000000 +00:00 . Il s'agit également de la valeur par défaut, vous pouvez donc omettre la valeur de précision et utiliser une échelle de 7 (ce qui donne une précision de 34). Vous pouvez réduire la précision si vous préférez. La réduction de la précision peut également réduire la quantité d'espace nécessaire pour stocker la valeur.

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.

Exemple 2 - 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 date et datetimeoffset .

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CAST(@thedate AS datetimeoffset) AS 'datetimeoffset';

Résultat :

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 |
+------------+------------------------------------+

Nous obtenons donc le même résultat que la conversion implicite.

Nous pouvons également ajuster l'heure comme ceci :

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  DATEADD(hour, 7, CAST(@thedate AS datetimeoffset)) AS 'datetimeoffset';

Résultat :

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 |
+------------+------------------------------------+

Notez que vous ne pouvez pas utiliser le DATEADD() fonction pour modifier le composant de décalage horaire. Mais ne vous inquiétez pas, il y a un moyen de le modifier (lisez la suite pour savoir comment).

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

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

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CONVERT(datetimeoffset, @thedate) AS 'datetimeoffset';

Résultat :

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 |
+------------+------------------------------------+

Et régler l'heure :

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  DATEADD(hour, 7, CONVERT(datetimeoffset, @thedate)) AS 'datetimeoffset';

Résultat :

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 |
+------------+------------------------------------+

Exemple 4 - Modifier le décalage horaire

Dans les exemples précédents, nous avons utilisé le DATEADD() fonction pour modifier la valeur du temps. Cette fonction peut être utilisée pour modifier n'importe quelle partie du composant de date ou d'heure, à l'exception du composant de décalage horaire .

Si vous avez besoin de modifier le décalage horaire, vous pouvez utiliser le TODATETIMEOFFSET() une fonction. Vous pouvez également utiliser cette fonction pour convertir la date d'origine valeur à un datetimeoffset valeur. Cette fonction accepte une valeur de date (qui peut se résoudre en datetime2 valeur) et une valeur de décalage.

Voici un exemple :

DECLARE @thedate date, @thedatetimeoffset datetimeoffset
SET @thedate = '2020-12-01'
SET @thedatetimeoffset = TODATETIMEOFFSET(@thedate, '+07:00')
SELECT 
  @thedate AS 'date',
  @thedatetimeoffset AS 'datetimeoffset';

Résultat :

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 |
+------------+------------------------------------+

Et voici un exemple utilisant la fonction dans le SELECT déclaration :

DECLARE @thedate date = '2020-12-01'
SELECT 
  @thedate AS 'date',
  TODATETIMEOFFSET(@thedate, '+07:00') AS 'datetimeoffset';

Résultat :

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 |
+------------+------------------------------------+

Le TODATETIMEOFFSET() la fonction accepte également un datetimeoffset valeur comme premier paramètre, vous pouvez donc également l'utiliser pour modifier datetimeoffset existant valeurs si nécessaire.

Exemple :

DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7)
SET @thedate = '2020-12-01'
SET @thedatetimeoffset = @thedate
SELECT 
  @thedate AS 'date',
  @thedatetimeoffset AS 'datetimeoffset',
  TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';

Résultat :

+------------+------------------------------------+------------------------------------+
| date       | datetimeoffset                     | Modified                           |
|------------+------------------------------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | 2020-12-01 00:00:00.0000000 +07:00 |
+------------+------------------------------------+------------------------------------+