Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Dove impostare un valore di data e ora UTC nell'applicazione a più livelli:livello di presentazione, dominio o database?

Voto per impostarlo nella procedura (o il default per la colonna, per gli inserti). Non vi è alcun motivo per passare tutte queste informazioni attraverso tutti i livelli a meno che non sia necessaria una precisione di microsecondi per differenziare, ad es. quando l'utente ha fatto clic sul pulsante rispetto a quando la transazione è stata salvata nel database. Ciò è particolarmente vero se si dispone di un'applicazione distribuita:si desidera fare affidamento su tutti i server Web/applicativi per essere sincronizzati, per non parlare delle workstation degli utenti finali per le app client/server? Potresti avere server in data center diversi, tutti con fusi orari diversi, alcuni osservano l'ora legale, altri no, ecc. DateTime.UtcNow dovrebbe cancellare la maggior parte di queste differenze, ma tornerei comunque a passare tutti quei dati in giro senza motivo. Il database sa che ore sono; lascia che memorizzi il valore per te e mantieni tutta quella logica fuori dall'applicazione.

(Inoltre, se stai memorizzando l'ora UTC, hai davvero bisogno di DATETIMEOFFSET ? In tal caso, hai ancora bisogno di un modo per la procedura per sapere da quale fuso orario provengono queste informazioni. In caso contrario, probabilmente dovresti semplicemente usare SMALLDATETIME/DATETIME/DATETIME2 a seconda della precisione richiesta.)