Com base em uma seleção, posso retornar x linhas 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
Temos todos os milissegundos com 0.
Existe uma maneira de adicionar 1 por 1 milissegundos, para que o select fique assim:
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
Estou tentando criar um cursor ou mesmo uma atualização sem sucesso.
Esta é a consulta para obter os resultados desejados:
select top 10 ModifiedOn
from [SCHEMA].[dbo].[TABLE]
where FIELD between '2019-07-23 00:00' and '2019-07-23 23:59'
Existem 81k valores. O campo é DATETIME
.
sql-server
sql-server-2008
datetime
varchar
Racer SQL
fonte
fonte
Respostas:
Datetime
não é preciso para o nível de 1 milissegundo. O que você está pedindo não é possível, a menos que você mude para um tipo de dados diferente (ou sejadatetime2
).Documentação
Citação importante:
fonte
A
DateAdd
função é o que você está procurando.Use
millisecond
como o primeiro parâmetro para a função, para informar que você está adicionando milissegundos. Em seguida, use1
como o segundo parâmetro, para adicionar o número de milissegundos.Aqui está um exemplo, capturando o tempo atual em uma variável e, em seguida, adicionando um milissegundo a ele e salvando o resultado como uma segunda variável e imprimindo cada variável
Resultados:
Nota:
Como Forrest aponta em outra resposta, o
datetime
tipo de dados não garante precisão de milissegundos. Arredonda para incrementos de 0,000, 0,003 ou 0,007 segundos. Se você quiser precisão de milissegundos, usedatetime2
.fonte
@ Doug-Deden tem o ponto de partida certo, mas eu só queria tentar responder o que eu pensava ser a intenção original da pergunta - como aplicá-la a um conjunto de resultados com milissegundos por linha cada vez maior.
Nesse caso, você pode usar ROW_NUMBER e uma expressão de tabela comum (edite conforme necessário para sua estrutura de tabela, incluindo junções, etc.).
Selecione para mostrar valores:
A atualização volta à tabela original:
fonte
Table1
. Apenas façaUPDATE CTE SET my_date_column =...
Eu fiz isso usando
DATETIME2(3)
.Como você pode ver na consulta abaixo, é mais
economic
:As diferenças entre
datetime
edatetime2
são bem explicadas aqui .Para este exercício, crio uma tabela temporária para fins de teste e a preencho com 999 diferentes
random dates
de01-jan-2019
e hoje (23-july-2019
)e, em seguida, defino os milissegundos de 1 a 999
e é isso que eu recebo: (vista parcial)
fonte
Um dos outros pôsteres está correto;
DATETIME
(em T-SQL) não é preciso até o milissegundo (é preciso até o centésimo de segundo).Para esse nível de precisão, você deseja usar
DATETIME2
.Aqui está um exemplo de conversão de uma string
datetime
paradatetime2
, em seguida, adicionando 1 milissegundo e, por último, convertendo novamente em uma string.fonte
varchar
sem tamanho .