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 :
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
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.
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.
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.
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).
Jetez un œil à dba.stackexchange.com/questions/108287/...
stackoverflow.com/questions/52431279/… < / a>