sql >> Base de Datos >  >> RDS >> Sqlserver

¿Dónde establecer un valor de fecha y hora UTC en una aplicación de n niveles:capa de presentación, dominio o base de datos?

Voto por establecerlo en el procedimiento (o el valor predeterminado para la columna, para inserciones). No hay razón para pasar toda esta información a través de todas las capas a menos que necesite una precisión de microsegundos para diferenciar, p. cuando el usuario hizo clic en el botón vs. cuando se comprometió la transacción en la base de datos. Esto es especialmente cierto si tiene una aplicación distribuida:¿desea confiar en que todos sus servidores web/de aplicaciones estén sincronizados, sin importar las estaciones de trabajo de los usuarios finales para las aplicaciones de cliente/servidor? Puede tener servidores en diferentes centros de datos, todos con diferentes zonas horarias, algunos respetando el horario de verano, otros no, etc. DateTime.UtcNow debería borrar la mayoría de esas diferencias, pero aún así volvería a pasar todos esos datos sin ningún motivo. La base de datos sabe qué hora es; deje que almacene el valor por usted y mantenga toda esa lógica fuera de la aplicación.

(Además, si está almacenando la hora UTC, ¿realmente necesita DATETIMEOFFSET ? Si es así, aún necesita alguna forma para que el procedimiento sepa de qué zona horaria proviene esta información. De lo contrario, probablemente debería usar SMALLDATETIME/DATETIME/DATETIME2 dependiendo de la precisión requerida).