3
votes

Déclarer la date et la date sélectionnée ne correspondent pas

J'ai déclaré une variable datetime appelée @dt -

select @dt --it gives '2019-01-29 11:06:31.097'

Lorsque je sélectionne la variable, la date est erronée

declare @dt Datetime = '2019-01-29 11:06:31.095'


3 Réponses :


6
votes

Selon le manuel :

Les valeurs datetime sont arrondies par incréments de .000, .003 ou .007 secondes, comme indiqué dans le tableau suivant.

Le tableau dans le lien fourni montre clairement la raison pour laquelle votre valeur est convertie de '.095' en '.097' :

User-specified value    System stored value
-----------------------------------------------
01/01/98 23:59:59.999   1998-01-02 00:00:00.000
01/01/98 23:59:59.995

01/01/98 23:59:59.996

01/01/98 23:59:59.997

01/01/98 23:59:59.998   1998-01-01 23:59:59.997


4 commentaires

Existe-t-il une solution qui donne la même date aux deux?


La solution est de migrer votre code pour utiliser datetime2 (3)


@SalmanA cela fonctionne lorsque j'utilise l'instruction SELECT, mais lorsque j'insère cette variable dans ma table, elle est insérée sous le nom `` 2019-01-29 11: 06: 31.097 '' car les types de données de la colonne sont datetime.Je dois surmonter ce problème .


@Thebeginner Il n'y a aucun moyen de stocker une valeur '.095' dans une colonne datetime . Vous devez convertir le type de données en datetime2 comme indiqué par @Salman.



2
votes

datetime dans le docs :

Précision - Arrondi aux incréments de .000, .003 ou .007 secondes

Utilisez les types de données time, date, datetime2 et datetimeoffset pour les nouveaux travail. Ces types correspondent à la norme SQL. Ils sont plus portables. time, datetime2 et datetimeoffset fournissent plus de précision en secondes. datetimeoffset prend en charge les fuseaux horaires pour les déploiements mondiaux applications.


0 commentaires

4
votes

Ce qui n'est pas mentionné dans le manuel est le fait que DATETIME stocke les dates avec une résolution de 1/300 th de seconde, c'est-à-dire des multiples de 0,0033333333 ... seconde. Voici quelques littéraux et valeurs datetime résultantes:

literal                    datetime
2019-01-29 11:06:31.094    2019-01-29 11:06:31.093
2019-01-29 11:06:31.095    2019-01-29 11:06:31.097
2019-01-29 11:06:31.096    2019-01-29 11:06:31.097
2019-01-29 11:06:31.097    2019-01-29 11:06:31.097
2019-01-29 11:06:31.098    2019-01-29 11:06:31.097
2019-01-29 11:06:31.099    2019-01-29 11:06:31.100

Vous devriez commencer à utiliser DATETIME2 type de données qui a une plage plus large (année 0001 à 9999) et plus de précision (jusqu'à 7 chiffres après la virgule). Vous pouvez déclarer la colonne comme DATETIME2 (3) pour avoir exactement trois chiffres après la décimale.


2 commentaires

cela fonctionne quand j'insère cette date dans ma table qui a le type de données datetime?


vous ne pouvez tout simplement pas stocker des valeurs telles que .001, .002, .995 etc. à l'intérieur de datetime telles quelles, elles seront arrondies (de travail = arrondies puis stockées).