Querendo obter todos os registros de um único dia. Portanto, tudo entre 2013-03-05 00:00:00.000
e 2013-03-05 23:59:59.999
. Estamos ficando sobrepostos no back-end com coisas que aconteceram em 2013-03-06 00:00:00.000
.
Então, nos testes eu corro no SSMS:
select cast('2013-03-05 23:59:59.999' as datetime)
select cast('2013-03-05 23:59:59.996' as datetime)
select cast('2013-03-05 23:59:59.994' as datetime)
E pegue:
2013-03-06 00:00:00.000
2013-03-05 23:59:59.997
2013-03-05 23:59:59.993
A parte do milissegundo volta um pouco. No caso da primeira linha, isso realmente importa. Porque não quero 2013-03-06 00:00:00.000 - quero um milissegundo antes da meia-noite.
TSQL declara na documentação que usa segundos fracionários em oposição a .Net datetime que usa milissegundos. Isso parece ser apenas uma diferença de sintaxe, mas se você realmente se preocupa com a precisão de milissegundos no TSQL, é forçado a usá DateTime2
-la em geral. A transmissão de datetime2
para datetime
ainda atrapalha as coisas em alguns milissegundos.
Em c# DateTime.Parse("03/5/2013 23:59:59.999").Millisecond
ainda retorna 999.
Estou interpretando bem? Se eu me preocupo com a precisão de milissegundos, estou preso datetime2
apenas a.
Normalmente, isso seria uma solução fácil, mas, neste caso, estamos usando uma função do sistema Microsoft que recebe datetime
como parâmetro.
Em vez de especificar 23:59:59.999, você deve especificar 23:59:59.997 devido ao arredondamento.
A maneira muito melhor seria:
Como isso captura TODA a atividade em 2013-03-05