Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Onde definir um valor de data e hora UTC em um aplicativo de n camadas:camada de apresentação, domínio ou banco de dados?


Eu voto para defini-lo no procedimento (ou o padrão para a coluna, para inserções). Não há razão para passar todas essas informações por todas as camadas, a menos que você precise de precisão de microssegundos para diferenciar, por exemplo, quando o usuário clicou no botão vs. quando a transação foi confirmada no banco de dados. Isso é especialmente verdadeiro se você tiver um aplicativo distribuído - você deseja confiar em todos os seus servidores da Web/aplicativos para estarem sincronizados, não importa as estações de trabalho do usuário final para aplicativos cliente/servidor? Você pode ter servidores em diferentes data centers, todos com fusos horários diferentes, alguns observando o horário de verão, outros não, etc. DateTime.UtcNow deve obliterar a maioria dessas diferenças, mas eu ainda voltaria a passar todos esses dados sem motivo. O banco de dados sabe que horas são; deixe que ele armazene o valor para você e mantenha toda essa lógica fora do aplicativo.

(Além disso, se você estiver armazenando a hora UTC, você realmente precisa de DATETIMEOFFSET ? Nesse caso, você ainda precisa de alguma maneira para o procedimento saber de qual fuso horário essas informações vieram. Caso contrário, você provavelmente deve usar SMALLDATETIME/DATETIME/DATETIME2 dependendo da precisão necessária.)