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

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

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

Lorsque vous convertissez une date valeur à datetime2 , des informations supplémentaires sont ajoutées à la valeur. C'est parce que le datetime2 Le type de données contient à la fois des informations de date et d'heure. La date Le type de données, en revanche, ne contient que des informations de date.

Le datetime2 le type de données est essentiellement une extension de datetime Type de données. Il a une plage de dates plus large, une précision fractionnaire par défaut plus grande et une précision optionnelle spécifiée par l'utilisateur.

Dans tous les cas, le processus de conversion est exactement le même quel que soit le type de données. La seule différence est la quantité d'informations disponibles entre la date , dateheure et datetime2 .

Exemple 1 – Conversion implicite

Voici un exemple de conversion implicite entre date et datetime2 .

DECLARE @thedate date, @thedatetime2 datetime2
SET @thedate = '2020-12-01'
SET @thedatetime2 = @thedate
SELECT 
  @thedate AS 'date',
  @thedatetime2 AS 'datetime2';

Résultat :

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

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 datetime2 variables.

Nous pouvons voir que la date la variable ne contient que des informations de date, alors que la variable datetime2 La variable contient à la fois des informations de date et d'heure.

De plus, nous obtenons plus d'informations temporelles que si nous les convertissions en datetime type de données.

Lorsque vous convertissez entre date et datetime2 en utilisant la précision par défaut (7), le composant de temps est défini sur 00:00:00.0000000 (par rapport à 00:00:00.000 pour dateheure ). Vous pouvez réduire la précision si vous préférez (voir ci-dessous). La réduction de la précision peut également réduire la quantité d'espace nécessaire pour stocker la valeur.

La raison pour laquelle le composant d'heure est composé uniquement de zéros est que la valeur de date ne contient aucune information d'heure. SQL Server n'a donc aucun moyen de savoir quelle heure vous voulez (le cas échéant).

Exemple 2 - Modifier l'heure

Si vous devez spécifier une heure (mais garder la même date), vous pouvez utiliser le DATEADD() fonction pour faire exactement cela.

DECLARE @thedate date, @thedatetime2 datetime2
SET @thedate = '2020-12-01'
SET @thedatetime2 = @thedate
SET @thedatetime2 = DATEADD(hour, 8, @thedatetime2)
SELECT 
  @thedate AS 'date',
  @thedatetime2 AS 'datetime2';

Résultat :

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

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 date et datetime2 .

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

Résultat :

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

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, 8, CAST(@thedate AS datetime2)) AS 'datetime2';

Résultat :

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

Exemple 4 - 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(datetime2, @thedate) AS 'datetime2';

Résultat :

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

Et régler l'heure :

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

Résultat :

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

Exemple 5 – Précision

Le datetime2 Le type de données vous permet de spécifier la précision (jusqu'à la valeur par défaut 7). En d'autres termes, vous n'avez pas besoin d'utiliser les 7 chiffres complets si vous n'en avez pas besoin.

Exemple :

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

Résultat :

+------------+------------------------+--------------------------+
| date       | datetime2(2)           | datetime2(4)             |
|------------+------------------------+--------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.00 | 2020-12-01 00:00:00.0000 |
+------------+------------------------+--------------------------+

L'un des avantages de la réduction de la précision est qu'elle peut également réduire la quantité d'espace nécessaire pour stocker la valeur. En particulier, 6 octets pour une précision inférieure à 3, 7 octets pour une précision 3 ou 4, et toutes les autres précisions nécessitent 8 octets. Cependant, notez que le premier octet est utilisé pour stocker la précision, donc la valeur réelle est la taille de stockage indiquée ici plus 1 octet supplémentaire pour stocker la précision.