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.