2013-06-05 102 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