【问题标题】:How should I persist timestamps in SQL DB if app uses NodaTime?如果应用程序使用 NodaTime,我应该如何在 SQL DB 中保留时间戳?
【发布时间】:2015-07-14 03:07:55
【问题描述】:

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

有时我将时间戳保存到 SQL Server 2008 数据库。我传统上在 UTC 中使用 datetime2 字段。这些时间戳将使用 Noda 创建。看来,将日期转换为 Noda 的 Instant 可能是不可取的。

我应该使用什么类型来持久化它们?

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

Noda 提出不能以 UTC 可靠地描述时刻的情况,因为某些时间从未在 UTC 中发生过。

【问题讨论】:

  • 答案取决于您未指定的数据库引擎。
  • @DanBracuk 添加了详细信息,谢谢。 MSSQL2008

标签: sql sql-server sql-server-2008 n-tier-architecture nodatime


【解决方案1】:

datetime2 是一种完全可以接受的普通 SQL 类型,用于存储 Instant。使用Instant.ToDateTimeUtc 方法获取DateTime,然后像往常一样将其存储在SQL 中。同样,您可以在从 SQL 检索值时使用 Instant.FromDateTimeUtc 方法。

或者,如果您想明确说明这些值是基于 UTC 的(偏移量始终为零),则可以使用 SQL datetimeoffset 类型。 Instant 上有 ToDateTimeOffsetFromDateTimeOffset 方法可以使用。

你说:

Noda 提出不能以 UTC 可靠地描述时刻的情况,因为某些时间从未在 UTC 中发生过。

我想你可能被the user guide 中的措辞所吸引。我可以看到它可能会如何引导您沿着这种思路走下去。虽然在逻辑上Instant 确实不代表 UTC,但它当然可以用 UTC 可靠地描述。也可以用其他一些术语来描述,只要这些术语是明确的。

用户指南的重点是在 UTC 中不是的其他值仍然可以转换为Instant。例如,我可能有一个OffsetDateTimeDateTimeOffset,其偏移量不同 为零,但仍可以将其调整回零以形成Instant。同样,我可能有一个分配给 UTC 时区或其他时区的 ZonedDateTime,但我仍然可以返回到单个通用 Instant 而不会失去保真度。

DateTime(除非它有DateTimeKind.Utc)或LocalDateTimeLocalDateLocalTime 等都不能说同样的。这些都不是明确的一个瞬间。

就其他映射而言:

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)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 2021-09-20
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
相关资源
最近更新 更多