如果应用程序使用NodaTime,我应该如何在SQL DB中保留时间戳?
我想在我的应用程序中开始使用NodaTime来管理时间,瞬间和一般的时间本地化.
有时我将时间戳记存储到SQL Server 2008数据库.我传统上使用UTC的datetime2字段.这些时间戳将使用Noda创建.似乎这个日期转换为Noda的Instant可能是不受欢迎的. 我应该用什么类型来坚持? 如果我在SQL中使用非整数,那么我的应用层和我的DAL之间有潜在的转换问题.但是,如果我保持整数Noda即时,我将具有相同层之间的逻辑耦合…我将无法在SQL中执行简单的日期聚合,而不会将其带入应用层或CLR. Noda在UTC时间内无法可靠地描述时间,因为某些时候从来没有发生在UTC. 解决方法datetime2是一个完全可以接受和正常的SQL类型来存储Instant.使用Instant.ToDateTimeUtc方法获取一个DateTime,然后将其存储在SQL中.同样,您可以在从SQL检索值时使用Instant.FromDateTimeUtc方法.或者,如果要显式地显示值是基于UTC(偏移量始终为零),则可以使用SQL datetimeoffset类型.有即时即可使用ToDateTimeOffset和FromDateTimeOffset方法. 你说:
我想也许你被赶上了the user guide年的措辞.我可以看到它会如何引导你走上这条思路.虽然逻辑上一个Instant并不代表UTC,但它肯定可以用UTC来可靠地描述.也可以用其他一些术语来描述,只要这些术语是明确的. 用户指南所做的一点是,其他不在UTC的值仍然可以转换为Instant.例如,我可能有一个OffsetDateTime,或者一个具有与零不同的偏移量的DateTimeOffset,并且仍然可以将其调整为零以形成Instant.同样,我可能有一个分配给UTC时区或其他时区的ZonedDateTime,我仍然可以恢复到单个通用即时而不会失去保真度. 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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |