Por lo general, tengo un "interceptor" que, justo antes de leer / escribir desde / hacia la base de datos, realiza la conversión DateTime (de UTC a hora local y de hora local a UTC), por lo que puedo usar DateTime.Now
(derivaciones y comparaciones) en todo el sistema sin preocuparme. sobre las zonas horarias.
Con respecto a la serialización y el movimiento de datos entre computadoras, no hay necesidad de preocuparse, ya que la fecha y hora siempre es UTC.
¿Debo seguir almacenando mis fechas (SQL 2008 - datetime) en formato UTC o debería almacenarlas usando DateTimeOffset
(SQL 2008 - datetimeoffset)?
Las fechas UTC en la base de datos (tipo de fecha y hora) han estado funcionando y se conocen durante tanto tiempo, ¿por qué cambiarlas? ¿Cuáles son las ventajas?
Ya he mirado artículos como este , pero no estoy 100% convencido. ¿Alguna idea?
fuente
Respuestas:
Hay una gran diferencia, en la que no puede usar UTC solo.
Si tienes un escenario como este
Luego:
Pero:
Un ejemplo sencillo es el sistema de reserva de billetes de avión ... El billete de avión debe contener 2 horas: - hora de "despegue" (en la zona horaria de la ciudad "De") - hora de "aterrizaje" (en la zona horaria de la ciudad de "Destino")
fuente
InputLocationId
(o una entidad normalizada similar)? Habría cálculos involucrados (hola, excepciones ... especialmente usted, Indiana ), pero sigue siendo un proceso determinista, y luego el equilibrio de la lógica de fecha y hora de la aplicación es sencillo.Tiene toda la razón al usar UTC para todos los tiempos históricos (es decir, se registraron eventos). Siempre es posible pasar de UTC a la hora local, pero no siempre al revés.
¿Cuándo usar la hora local? Responde esta pregunta:
Solo guarde la hora local si la respuesta es "sí". Obviamente, eso solo será para fechas futuras, y generalmente solo para fechas que afectan a las personas de alguna manera.
¿Por qué almacenar una zona horaria / compensación?
En primer lugar, si desea registrar cuál fue el desplazamiento para el usuario que llevó a cabo la acción, probablemente sería mejor hacerlo, es decir, al iniciar sesión, registre la ubicación y la zona horaria de ese usuario.
En segundo lugar, si desea convertir para visualización, necesita tener una tabla de todas las transiciones de compensación de tiempo local para esa zona horaria, simplemente saber que la compensación actual no es suficiente, porque si está mostrando una fecha / hora de hace seis meses, la compensación será sé diferente.
fuente
Un DATETIMEOFFSET le brinda la posibilidad de almacenar la hora local y la hora UTC en un campo.
Esto permite generar informes muy simples y eficientes en hora local o UTC sin la necesidad de procesar los datos para su visualización de ninguna manera.
Estos son los dos requisitos más comunes: la hora local para los informes locales y la hora UTC para los informes de grupo.
La hora local se almacena en la parte DATETIME del DATETIMEOFFSET y el OFFSET de UTC se almacena en la parte OFFSET, por lo que la conversión es simple y, dado que no requiere conocimiento de la zona horaria de la que provienen los datos, todo se puede hacer a nivel de base de datos .
Si no necesita tiempos de milisegundos, por ejemplo, solo minutos o segundos, puede usar DATETIMEOFFSET (0). El campo DATETIMEOFFSET solo requerirá 8 bytes de almacenamiento, lo mismo que DATETIME.
Por lo tanto, el uso de DATETIMEOFFSET en lugar de UTC DATETIME brinda más flexibilidad, eficiencia y simplicidad para los informes.
fuente