Quase todas as respostas e comentários foram pesadas sobre os profissionais e leves sobre os contras. Aqui está uma recapitulação de todos os prós e contras até agora, além de alguns contras cruciais (no # 2 abaixo) que eu já vi mencionados uma vez ou não.
- PROS:
1.1 Mais compatível com ISO (ISO 8601) (embora eu não saiba como isso entra em jogo na prática).
1.2 Mais alcance (1/1/0001 a 31/12/9999 vs. 1/1 / 1753-12 / 31/9999) (embora o intervalo extra, todos anteriores ao ano 1753, provavelmente não seja usado, exceto por ex., em aplicativos históricos, astronômicos, geológicos etc.).
1.3 Corresponde exatamente ao intervalo do tipo do .NET DateTime
(embora ambos convertam para frente e para trás sem codificação especial se os valores estiverem dentro do intervalo e da precisão do tipo de destino, exceto a Con # 2.1 abaixo, caso contrário, ocorrerá erro / arredondamento).
1.4 Mais precisão (100 nanossegundos, também conhecido como 0,000,000,1 seg. Vs. 3,33 milissegundos, também conhecido como 0,003,33 seg.) (Embora a precisão extra provavelmente não seja usada, exceto, por exemplo, em aplicativos de engenharia / científicos).
1.5 Quando configurado para precisão semelhante (como em 1 milissegundo, não "igual" (como em 3,33 milissegundos) como Iman Abidi afirmou) DateTime
, usa menos espaço (7 x 8 bytes), mas é claro que você perderia o benefício de precisão que é provavelmente um dos dois (o outro sendo o intervalo) mais elogiado, embora prováveis benefícios desnecessários).
- CONTRAS:
2.1 Ao passar um Parâmetro para um .NET SqlCommand
, você deve especificar System.Data.SqlDbType.DateTime2
se pode estar passando um valor fora do DateTime
intervalo e / ou precisão do SQL Server , porque o padrão é System.Data.SqlDbType.DateTime
.
2.2 Não pode ser implicitamente / facilmente convertido em um valor numérico de ponto flutuante (número de dias desde a data e hora mín.) Para fazer o seguinte nas expressões do SQL Server usando valores e operadores numéricos:
2.2.1 adicione ou subtraia o número de dias ou dias parciais. Nota: Usar o DateAdd
Function como solução alternativa não é trivial quando você precisa considerar várias, se não todas, partes da data e hora.
2.2.2 faça a diferença entre duas datas para fins de cálculo da "idade". Nota: Você não pode simplesmente usar a DateDiff
Função do SQL Server , porque ela não calcula age
como a maioria das pessoas esperaria, pois se as duas datas atravessarem um limite de calendário / relógio das unidades especificadas, mesmo que por uma pequena fração dessa unidade, vai voltar a diferença de que, como uma unidade contra a 0. Por exemplo, o DateDiff
na Day
's de duas vezes data apenas 1 milissegundo além retornará 1 vs 0 (dias), se essas data vezes são em diferentes dias do calendário (por exemplo, “1999-12-31 23: 59: 59.9999999” e “2000-01-01 00: 00: 00.0000000”). A mesma diferença de 1 milissegundo de data e hora, se movida para que não cruzem um dia do calendário, retornará um "DateDiff" em Day
0 (dias).
2.2.3 adote as Avg
datas e horários (em uma Consulta Agregada) simplesmente convertendo para "Flutuar" primeiro e depois novamente para DateTime
.
NOTA: Para converter DateTime2
para um numérico, é necessário fazer algo como a seguinte fórmula, que ainda assume que seus valores não são inferiores ao ano de 1970 (o que significa que você está perdendo todo o intervalo extra mais outros 217 anos. Nota: você pode não é possível simplesmente ajustar a fórmula para permitir um intervalo extra, pois você pode encontrar problemas de estouro numérico.
25567 + (DATEDIFF(SECOND, {d '1970-01-01'}, @Time) + DATEPART(nanosecond, @Time) / 1.0E + 9) / 86400.0
- Fonte: " https://siderite.dev/blog/how-to-translate-t-sql-datetime2-to.html "
Obviamente, você também Cast
pode DateTime
primeiro (e, se necessário, voltar a DateTime2
), mas perderia os benefícios de precisão e alcance (todos anteriores ao ano de 1753) DateTime2
vs., DateTime
que são os dois maiores e também ao mesmo tempo o 2 provavelmente menos necessário, o que sugere a questão de por que usá-lo quando você perde as conversões implícitas / fáceis para numérico de ponto flutuante (número de dias) para adição / subtração / benefício "idade" (vs. DateDiff
) / Avg
cálculos, que é grande em minha experiência.
Aliás, a Avg
data e hora é (ou pelo menos deveria ser) um caso de uso importante. a) Além de ser usado para obter duração média quando as datas e horários (desde uma data-base comum) são usadas para representar a duração (uma prática comum), b) também é útil obter uma estatística do tipo painel sobre qual a data média- time está na coluna de data e hora de um intervalo / grupo de linhas. c) Uma consulta ad-hoc padrão (ou pelo menos deve ser padrão) para monitorar / solucionar problemas de valores em uma coluna que pode não ser mais válida / mais e / ou talvez precise ser preterida é listar para cada valor a contagem de ocorrências e (se disponível) os Min
, Avg
e Max
selos de data e hora associado a esse valor.