Sur la base d'une sélection, je peux retourner x lignes comme ceci:
1 2019-07-23 10:14:04.000
1 2019-07-23 10:14:11.000
2 2019-07-23 10:45:32.000
1 2019-07-23 10:45:33.000
Nous avons toutes les millisecondes avec 0.
Existe-t-il un moyen d'ajouter 1 par 1 millisecondes, de sorte que la sélection ressemble à ceci:
1 2019-07-23 10:14:04.001
1 2019-07-23 10:14:11.002
2 2019-07-23 10:45:32.003
1 2019-07-23 10:45:33.004
J'essaie de créer un curseur ou même une mise à jour sans succès.
Voici la requête pour obtenir les résultats que je souhaite:
select top 10 ModifiedOn
from [SCHEMA].[dbo].[TABLE]
where FIELD between '2019-07-23 00:00' and '2019-07-23 23:59'
Il y a 81k valeurs. Le champ est DATETIME
.
sql-server
sql-server-2008
datetime
varchar
Racer SQL
la source
la source
Réponses:
Datetime
n'est pas précis au niveau de 1 milliseconde. Ce que vous demandez n'est possible que si vous changez de type de données (c.datetime2
-à-d.).Documentation
Citation importante:
la source
La
DateAdd
fonction est ce que vous recherchez.Utilisez
millisecond
comme premier paramètre de la fonction pour lui indiquer que vous ajoutez des millisecondes. Utilisez ensuite1
comme deuxième paramètre, le nombre de millisecondes à ajouter.Voici un exemple, en saisissant l'heure actuelle dans une variable, puis en y ajoutant une milliseconde et en enregistrant le résultat en tant que deuxième variable, puis en imprimant chaque variable
Résultats:
Remarque:
Comme Forrest le fait remarquer dans une autre réponse, le
datetime
type de données ne garantit pas la précision en millisecondes. Il arrondit à des incréments de .000, .003 ou .007 secondes. Si vous voulez une précision en millisecondes, utilisezdatetime2
.la source
@ Doug-Deden a le bon point de départ, mais je voulais juste essayer de répondre à ce que je pensais être l'intention initiale de la question - comment l'appliquer à un jeu de résultats avec des millisecondes croissantes par ligne.
Dans ce cas, vous pouvez utiliser ROW_NUMBER et une expression de table commune (modifiez selon les besoins pour la structure de votre table, y compris les jointures, etc.).
Sélectionnez pour afficher les valeurs:
Mettre à jour les jointures à la table d'origine:
la source
Table1
.UPDATE CTE SET my_date_column =...
Je l'ai fait en utilisant
DATETIME2(3)
.Comme vous pouvez le voir sur la requête ci-dessous, c'est plus
economic
:Les différences entre
datetime
etdatetime2
sont bien expliquées ici .Pour cet exercice, je crée une table temporaire à des fins de test et je la remplis avec 999 différentes
random dates
de celles d'01-jan-2019
aujourd'hui (23-july-2019
)puis dans l'ordre, j'ai mis les millisecondes de 1 à 999
et voici ce que j'obtiens: (vue partielle)
la source
L'une des autres affiches est correcte;
DATETIME
(en T-SQL) n'est pas précis à la milliseconde (il est précis à la centiseconde).Pour ce niveau de précision, vous souhaitez utiliser
DATETIME2
.Voici un exemple de conversion d'une chaîne
datetime
endatetime2
, puis en ajoutant 1 milliseconde, et enfin, en reconvertissant en chaîne.la source
varchar
sans longueur .