9

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

4

3 回答 3

18

您可以为实体框架模型使用 .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

...基于从 1900 年 1 月 1 日到 2079 年 6 月 6 日的有效范围,如 MSDN 中所述。

于 2013-06-05T17:42:45.100 回答
9

Sql Serverdatetimesmalldatetime自动映射到 CLR 的System.DateTime. Asmalldatetime的精度为1分钟;adatetime的精度约为 1/300 秒(不要问为什么。就是这样)。由于 CLR 的System.DateTime1精度为 100 纳秒,因此运行时负责舍入。

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

    在转换中,秒和小数秒使用 SQL Server 的神秘日期/时间舍入规则进行舍入,因此日期 2013-01-31 23:59:59 会舍入到下一个日期2013-02-01 00:00:00 '。

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

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

如果您想对事物进行更多控制,则需要先在 C# 中调整日期时间值,然后再将它们发送到数据库。

于 2013-06-05T17:15:42.257 回答
-1

也许你可以做类似 YourDateTime.Date

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

于 2013-06-05T16:30:31.460 回答