2013-06-05 64 views
2

如何在c#中将datetime转换为smalldatetime?我正在将日期和ı需要将其转换为与数据库一致。禁止在sql中更改列的数据类型。在c中将DateTime转换为SmallDateTime#

+1

相关:http://stackoverflow.com/questions/14124887/datetime-from-net-to-smalldatetime-in-sql-how-to-do-queries –

+0

请告诉我们相关的代码。你说你在转换,但你的意思是在一个where子句中吗?在您的实体反序列化?还有别的吗? –

+0

而且由于这是下变换,所以您最好从解释smalldatetime边界边缘的值中解释您想要的内容。 – DonBoitnott

回答

6

您可以对实体框架模型使用.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上的记录。

+2

您也可以使用数据注释'[Column(TypeName =“smalldatetime”)]'更改列类型。见http://stackoverflow.com/a/4833477/1180926 – Arithmomaniac

+0

@Arithmomaniac是的,它看起来像EF 4.3.1列类型数据注释的作品。尼斯。 –

-1

也许你可以这样做YourDateTime.Date

通常情况下,当你这样做的方式,它会设置时间为00:00:00。

+0

'smalldatetime' *可以*表示一个时间组件。请参阅[文档](http://msdn.microsoft.com/en-us/library/ms182418.aspx) –

5

Sql Server的datetimesmalldatetime都是自动映射到从CLR的System.DateTime。 A smalldatetime具有1分钟的精确度;一个datetime的精度约为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)开始计数的毫秒数。 datetime的时代为1900-01-01 00:00:00.000。

    而且,同样神秘的方式在转换中将值舍入为四舍五入,并且将固定秒数置于SQL Server的适当毫秒桶之一中,为3ms的倍数—没有像2013年那样的SQL Server`日期时间值-05-01 13:57:23.004。这将被“舍入”为23.003ms或23.006ms。

如果你想更多地控制事情,你需要在C#中调整你的日期时间值,然后将它们发送到数据库。

+0

Eh? SQL Server以无明显原因以0.000,0.003或0.007秒为增量计算时间。自从Sybase时代以来,它一直都是。即使如此,在Windows NT下,BIOS和WinNT系统时钟都具有分辨率c。 10毫秒。 Sybase必须使用CMOS“实时”时钟实现自己的时间实现,绕过BIOS。这个芯片在32.768 kHz这样的东西上打勾,使得二进制算术变得容易。为什么他们会将这个问题敲入不规则大小的桶中,这些桶与十进制值或二进制表示形式不匹配。我确信当时对某人有意义。 –

+0

我完全误读了第一次,如果你是说有没有合理性datetime'的'不同的精度和'smalldatetime',不要再追上的事实,你paranthetical提到的任意1/300 S的'精度datetime'。现在大胆地删除我误导的评论。 – jball