Na podstawie zaznaczenia mogę zwrócić x wierszy w następujący sposób:
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
Wszystkie milisekundy mają 0.
Czy istnieje sposób na dodanie 1 na 1 milisekundę, więc zaznaczenie wyglądałoby tak:
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
Próbuję utworzyć kursor, a nawet aktualizację bez powodzenia.
To jest zapytanie, aby uzyskać pożądane wyniki:
select top 10 ModifiedOn
from [SCHEMA].[dbo].[TABLE]
where FIELD between '2019-07-23 00:00' and '2019-07-23 23:59'
Jest 81k wartości. To pole jest DATETIME
.
sql-server
sql-server-2008
datetime
varchar
Racer SQL
źródło
źródło
Odpowiedzi:
Datetime
nie jest dokładny do poziomu 1 milisekundy. To, o co prosisz, nie jest możliwe, chyba że zmienisz inny typ danych (tjdatetime2
.).Dokumentacja
Ważny cytat:
źródło
The
DateAdd
Funkcją jest to, czego szukasz.Użyj
millisecond
jako pierwszego parametru do funkcji, aby powiedzieć jej, że dodajesz milisekundy. Następnie użyj1
jako drugiego parametru liczby milisekund do dodania.Oto przykład, pobieranie bieżącego czasu do zmiennej, a następnie dodawanie do niego jednej milisekundy i zapisywanie wyniku jako drugiej zmiennej, a następnie drukowanie każdej zmiennej
Wyniki:
Uwaga:
Jak Forrest wskazuje w innej odpowiedzi,
datetime
typ danych nie gwarantuje precyzji w milisekundach. Zaokrągla to z dokładnością do 0,000, 0,003 lub 0,007 sekundy. Jeśli chcesz mieć milisekundową precyzję, użyjdatetime2
.źródło
@ Doug-Deden ma właściwy punkt wyjścia, ale chciałem tylko spróbować odpowiedzieć na to, co według mnie było pierwotnym zamiarem pytania - jak zastosować je do zestawu wyników ze wzrostem milisekund na wiersz.
W takim przypadku możesz użyć ROW_NUMBER i wspólnego wyrażenia tabelowego (edytuj w razie potrzeby strukturę tabeli, w tym sprzężenia itp.).
Wybierz, aby wyświetlić wartości:
Aktualizacja łączy ponownie do oryginalnej tabeli:
źródło
Table1
. Po prostu zróbUPDATE CTE SET my_date_column =...
Zrobiłem to za pomocą
DATETIME2(3)
.Jak widać na poniższym zapytaniu, jest więcej
economic
:Różnice między
datetime
idatetime2
są tutaj dobrze wyjaśnione .W tym ćwiczeniu tworzę tabelę tymczasową do celów testowych i wypełniam ją wartością 999 inną
random dates
niż01-jan-2019
obecnie (23-july-2019
)a następnie w kolejności ustawiam milisekundy od 1 do 999
i oto co otrzymuję: (częściowy widok)
źródło
Jeden z pozostałych plakatów jest poprawny;
DATETIME
(w T-SQL) nie jest dokładny do milisekundy (jest dokładny do centisekundy).Dla tego poziomu dokładności chcesz użyć
DATETIME2
.Oto przykład konwersji łańcucha
datetime
nadatetime2
, następnie dodania 1 milisekundy, a na koniec konwersji z powrotem na łańcuch.źródło
varchar
bez długości .