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 类型.有ToDateTimeOffset和FromDateTimeOffset上方法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)
| 归档时间: |
|
| 查看次数: |
1637 次 |
| 最近记录: |