如果应用程序使用NodaTime,我应该如何在SQL DB中保留时间戳?

Mat*_*hew 19 sql sql-server n-tier-architecture sql-server-2008 nodatime

我想在我的应用程序中开始使用NodaTime来管理时间,瞬间和一般时间本地化.

有时我会将时间戳保留在SQL Server 2008数据库中.我传统上使用UTC中的datetime2字段.这些时间戳将使用Noda创建.似乎这个日期转换为Noda's Instant可能是不可取的.

我应该用什么类型来坚持下去?

如果我在SQL中使用非整数,那么我的App层和DAL之间可能存在转换问题.但是,如果我坚持整数Noda瞬间,我将在相同的层之间进行逻辑耦合......并且我将无法在SQL中执行简单的日期聚合而不将其带入应用层或CLR.

Noda认为,在UTC中无法可靠地描述时刻,因为UTC中从未发生过某些时间.

Mat*_*int 33

A datetime2是一个完全可以接受的普通SQL类型来存储Instant.使用该Instant.ToDateTimeUtc方法获取a DateTime,然后正常存储在SQL中.同样,您可以Instant.FromDateTimeUtc在从SQL中检索值时使用该方法.

或者,datetimeoffset如果您希望明确表示值是基于UTC的(偏移量始终为零),则可以使用SQL 类型.有ToDateTimeOffsetFromDateTimeOffset上方法Instant可以使用.

你说:

Noda认为,在UTC中无法可靠地描述时刻,因为UTC中从未发生过某些时间.

我想也许你会被用户指南中的措辞所吸引.我可以看到它如何引导你思考这条思路.虽然从逻辑上讲Instant它不代表UTC,但它当然可以用UTC来可靠地描述.它也可以用其他术语来描述,只要这些术语是明确的.

用户指南所做的一点是,其他不在 UTC中的值仍然可以转换为Instant.例如,我可能有一个OffsetDateTime或者DateTimeOffset有一个不同于零的偏移量,并且它仍然可以调整回零以形成一个Instant.同样地,我可能有一个ZonedDateTime分配给UTC时区或其他时区,我仍然可以回到单个通用Instant而不会失去保真度.

同样不能说的DateTime(除非它有DateTimeKind.Utc)或,LocalDateTime,LocalDate,LocalTime,等等这些都不是明确的单个时间瞬间.

至于其他映射:

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)
Run Code Online (Sandbox Code Playgroud)