在c#中将DateTime转换为SmallDateTime

时间:2013-06-05 16:25:37

标签: c# asp.net entity-framework

如何在c#中将datetime转换为smalldatetime?我正在接受日期和ı需要将其转换为符合数据库。禁止在sql中更改列的数据类型。

3 个答案:

答案 0 :(得分:8)

您可以将.NET DateTime 类型用于实体框架模型,但告诉EF它在数据库中使用非默认列类型。您可以通过覆盖DbContext的 OnModelCreating 方法并使用 HasColumnType 方法来执行此操作:

public class Foo    
{
    public int Id { get; set; }
    public DateTime IAmSoSmall { get; set; }    // wants to be smalldatetime in SQL
}

public class MyContext : DbContext
{
    public DbSet<Foo> Foos { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var foo = modelBuilder.Entity<Foo>();
        foo.Property(f => f.IAmSoSmall).HasColumnType("smalldatetime");

        base.OnModelCreating(modelBuilder);
    }
}

当然,您必须对DateTime属性进行适当的范围检查,以确保存储的值介于SQL的smalldatetime支持的值之间。我想你可以使用属性如:

来做到这一点
    [Range(typeof(DateTime), "1/1/1900", "6/6/2079")]
    public DateTime IAmSoSmall { get; set; }    // wants to be smalldatetime in SQL

...基于MSDN上记录的1900年1月1日至2079年6月6日的有效范围。

答案 1 :(得分:7)

Sql Server datetimesmalldatetime都是自动映射到CLR的System.DateTime和来自CLR的smalldatetimedatetime的精度为1分钟; System.DateTime1的精度约为1/300秒(不要问为什么。它只是)。由于CLR的smalldatetime具有100纳秒的精度,因此运行时负责舍入。

  • smalldatetime内部是一个32位整数,包含自datetime纪元(1900-01-01 00:00)以来的分钟数。

    在转换中,使用SQL Server的晦涩日期/时间舍入规则舍入秒和小数秒,因此日期2013-01-31 23:59:59将四舍五入到下一个日期2013- 02-01 00 :00:00

  • datetime是一对内部的32位整数。高阶词是自纪元以来的天数;低位字是自开始日(00:00:00)以来的毫秒数。 {{1}}的纪元是1900-01-01 00:00:00.000。

    同样,在转换中以相同的神秘方式舍入值,将法定秒放入SQL Server的适当毫秒桶之一,3ms的倍数 - 没有像2013年那样的SQL Server`datetime值 - 05-01 13:57:23.004。这将“四舍五入”到23.003ms或23.006ms。

如果您想要更多地控制事物,您需要在将它们发送到数据库之前在C#中调整日期时间值。

答案 2 :(得分:-1)

也许你可以做像YourDateTime.Date

这样的事情

通常,当你这样做时,它会将时间设置为00:00:00。