tier data application sql sql-server sql-server-2008 n-tier-architecture nodatime

extract data tier application sql server



¿Cómo debo persistir las marcas de tiempo en SQL DB si la aplicación usa NodaTime? (1)

Un datetime2 es un tipo SQL perfectamente aceptable y normal para almacenar un Instant . Use el método Instant.ToDateTimeUtc para obtener un DateTime , luego guárdelo en SQL de manera normal. Del mismo modo, puede utilizar el método Instant.FromDateTimeUtc cuando recupere el valor de SQL.

Alternativamente, podría usar un tipo de conjunto de datos de SQL si quisiera ser explícito de que los valores están basados ​​en UTC (el desplazamiento siempre será cero). ToDateTimeOffset FromDateTimeOffset métodos ToDateTimeOffset y FromDateTimeOffset en Instant .

Tu dijiste:

Noda afirma que los instantes no se pueden describir de manera confiable en UTC, ya que ciertas veces nunca ocurrieron en UTC.

Creo que quizás estás atrapado en la redacción de la guía del usuario . Puedo ver cómo podría llevarte a esa línea de pensamiento. Si bien es cierto que, lógicamente, un Instant no representa UTC, ciertamente puede describirse de manera confiable en términos de UTC. También podría describirse en algunos otros términos, siempre que esos términos fueran inequívocos.

El punto que señala la guía del usuario es que otros valores que no están en UTC podrían convertirse a un Instant . Por ejemplo, podría tener un OffsetDateTime , o un DateTimeOffset que tiene un desplazamiento diferente a cero, y aún podría ajustarse de nuevo a cero para formar un Instant . Del mismo modo, es posible que tenga un ZonedDateTime asignado a la zona horaria UTC, o alguna otra zona horaria, todavía puedo volver a un solo Instant universal sin pérdida de fidelidad.

No se puede decir lo mismo de DateTime (a menos que tenga DateTimeKind.Utc ), o de LocalDateTime , LocalDate , LocalTime , etc. Ninguno de ellos es inequívocamente un solo instante en el tiempo.

En cuanto a las otras asignaciones:

Noda Time | .NET BCL | SQL Server ---------------|----------------------------|------------------------------------------ Instant | DateTime or DateTimeOffset | datetime2 or datetimeoffset OffsetDateTime | DateTimeOffset | datetimeoffset LocalDateTime | DateTime | datetime2 LocalDate | DateTime | date LocalTime | TimeSpan | time Duration | TimeSpan | int or bigint (Ticks, TotalSeconds, etc.) Period | String | varchar ZonedDateTime | DateTimeOffset + String | datetimeoffset + varchar (or a UDT)

Quiero comenzar a usar NodaTime en mi aplicación para administrar los tiempos, instantes y la localización general del tiempo.

A veces persisto las marcas de tiempo en una base de datos de SQL Server 2008. Tradicionalmente había usado los campos datetime2 en UTC. Estas marcas de tiempo se crearán utilizando Noda. Parece que esta conversión de fecha a Instant de Noda puede ser indeseable.

¿Qué tipo debo usar para persistirlos?

Si utilizo un no entero en SQL, tengo problemas potenciales de conversión entre mi capa de aplicación y mi DAL. Sin embargo, si persisto el instante entero de Noda, tendré un acoplamiento lógico entre las mismas capas ... y no podré realizar agregaciones de fechas simples en SQL sin llevarlo a la capa de aplicación o CLR.

Noda afirma que los instantes no se pueden describir de manera confiable en UTC, ya que ciertas veces nunca ocurrieron en UTC.