我试图在SQL server 2008 R2中存储. net TimeSpan。
EF Code First似乎建议它应该存储为SQL中的时间(7)。
然而。net中的TimeSpan可以处理超过24小时的时间。
在SQL server中存储。net TimeSpan的最佳方法是什么?
我试图在SQL server 2008 R2中存储. net TimeSpan。
EF Code First似乎建议它应该存储为SQL中的时间(7)。
然而。net中的TimeSpan可以处理超过24小时的时间。
在SQL server中存储。net TimeSpan的最佳方法是什么?
当前回答
没有直接的对等物。只需以数字形式存储,例如秒数或适合您所需精度的内容。
其他回答
没有直接的对等物。只需以数字形式存储,例如秒数或适合您所需精度的内容。
我会存储时间跨度。然后使用Timespan.FromSeconds(TotalSeconds)检索它。
根据你需要的分辨率,你可以使用TotalMilliseconds, TotalMinutes, TotalDays。
您还可以在数据库中调整浮点数的精度。
这不是一个确切的值……但是这样做的好处是它很容易在简单的查询中读取和计算。
我将它作为BIGINT存储在数据库中,我将存储tick的数量(例如。时间间隔。蜱虫属性)。
这样,如果我想在检索时获得一个TimeSpan对象,我只需执行TimeSpan. fromticks (value),这很简单。
谢谢你的建议。因为在SQL server中没有对等的。我简单地创建了第二个字段,将TimeSpan转换为tick并将其存储在DB中。然后,我阻止存储TimeSpan
public Int64 ValidityPeriodTicks { get; set; }
[NotMapped]
public TimeSpan ValidityPeriod
{
get { return TimeSpan.FromTicks(ValidityPeriodTicks); }
set { ValidityPeriodTicks = value.Ticks; }
}
现在,使用EF Core,您可以在AppDbContext中透明地转换数据类型
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// i.e. Store TimeSpan as string (custom)
modelBuilder
.Entity<YourClass>()
.Property(x => x.YourTimeSpan)
.HasConversion(
timeSpan => timeSpan.ToString(), // To DB
timeSpanString => TimeSpan.Parse(timeSpanString) // From DB
);
// i.e. Store TimeSpan as string (using TimeSpanToStringConverter)
modelBuilder
.Entity<YourClass>()
.Property(x => x.YourTimeSpan)
.HasConversion(new TimeSpanToStringConverter());
// i.e. Store TimeSpan as number of ticks (custom)
modelBuilder
.Entity<YourClass>()
.Property(x => x.YourTimeSpan)
.HasConversion(
timeSpan => timeSpan.Ticks, // To DB
timeSpanString => TimeSpan.FromTicks(timeSpanString) // From DB
);
// i.e. Store TimeSpan as number of ticks (using TimeSpanToTicksConverter)
modelBuilder
.Entity<YourClass>()
.Property(x => x.YourTimeSpan)
.HasConversion(new TimeSpanToTicksConverter());
}