Basado en una selección, puedo devolver x filas como esta:
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
Tenemos todos los milisegundos con 0.
¿Hay alguna manera de agregar 1 por 1 milisegundos, por lo que la selección se vería así:
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
Estoy tratando de crear un cursor o incluso una actualización sin éxito.
Esta es la consulta para obtener los resultados que quiero:
select top 10 ModifiedOn
from [SCHEMA].[dbo].[TABLE]
where FIELD between '2019-07-23 00:00' and '2019-07-23 23:59'
Hay 81k valores. El campo es DATETIME
.
sql-server
sql-server-2008
datetime
varchar
Racer SQL
fuente
fuente
Respuestas:
Datetime
no es preciso al nivel de 1 milisegundo. Lo que solicita no es posible a menos que cambie a un tipo de datos diferente (es decirdatetime2
).Documentación
Cita importante:
fuente
La
DateAdd
función es lo que estás buscando.Úselo
millisecond
como primer parámetro de la función para indicarle que está agregando milisegundos. Luego, use1
como segundo parámetro, para la cantidad de milisegundos que se agregarán.Aquí hay un ejemplo: tomar el tiempo actual en una variable, y luego agregarle un milisegundo y guardar el resultado como una segunda variable, y luego imprimir cada variable
Resultados:
Nota:
Como Forrest señala en otra respuesta, el
datetime
tipo de datos no garantiza una precisión de milisegundos. Se redondea a incrementos de .000, .003 o .007 segundos. Si desea precisión de milisegundos, usedatetime2
.fuente
@ Doug-Deden tiene el punto de partida correcto, pero solo quería intentar responder a lo que pensé que era la intención original de la pregunta: cómo aplicarlo a un conjunto de resultados con milisegundos crecientes por fila.
En ese caso, puede usar ROW_NUMBER y una expresión de tabla común (edite según sea necesario para la estructura de su tabla, incluidas las combinaciones, etc.).
Seleccione para mostrar valores:
La actualización vuelve a la tabla original:
fuente
Table1
. Just doUPDATE CTE SET my_date_column =...
Lo he hecho usando
DATETIME2(3)
.Como puede ver en la consulta a continuación, es más
economic
:Las diferencias entre
datetime
ydatetime2
están bien explicadas aquí .Para este ejercicio, creo una tabla temporal con fines de prueba y la relleno con 999 diferentes
random dates
de01-jan-2019
y hoy (23-july-2019
)y luego en orden, configuré los milisegundos de 1 a 999
y esto es lo que obtengo: (vista parcial)
fuente
Uno de los otros carteles es correcto;
DATETIME
(en T-SQL) no es exacto al milisegundo (es exacto al centisegundo).Para ese nivel de precisión, desea utilizar
DATETIME2
.Aquí hay un ejemplo de convertir una cadena
datetime
adatetime2
, luego agregar 1 milisegundo y, por último, volver a convertir a una cadena.fuente
varchar
sin longitud .