2014-07-08 11 views
1

有沒有辦法在c#中複製這個整數值?如何在c#中複製c#datetime整數值?#

select cast(getdate() as int) 
--> 
41827 

我想這一點,但它不是與SQL日期一致:

public string SqlDate { 
    get 
    { 
     double x = (DateTime.Now - DateTime.FromOADate(0)).TotalDays; 
     return Math.Floor(x).ToString(); 
    } 
} 
+1

以何種方式是不相符的,多少天是它關掉? – CodeCaster

+0

您使用的是哪個數據庫? –

+3

你試圖解決什麼是潛在的問題? – Pleun

回答

1

一個SQL Server datetime值在內部是一個元組,保持2符號的32位整數:

  • 高階整數偏移量,在全天內,從所述時元(零點) SQL Server日曆,恰好是1 Jan 1900 00:00:00.000

  • 低位整數是從開始日起的偏移量,而不是以毫秒爲單位,而是在大約1/300秒的「滴答聲」中。

getdate()返回當前日期和時間爲datetime值。表達cast(getdate() as int)是完全等同於

datediff(day,'1 Jan 1900 00:00:00.000',getdate()) 

這個查詢

declare @epoch datetime = '4 July 2014 00:00:01.000' 
select [raw]   = @epoch , 
     [cast]   = cast(@epoch as int) , 
     [datediff]  = datediff(day,'1 Jan 1900',@epoch) , 
     [highorder-word] = convert(int,substring(convert(varbinary(8),@epoch),1,4)) , 
     [low-order-word] = convert(int,substring(convert(varbinary(8),@epoch),4,8)) 

產生以下結果:

raw      cast datediff highorder-word low-order-word 
----------------------- ----- -------- -------------- -------------- 
2014-07-04 00:00:01.000 41822 41822   41822   300 

[你會發現,有1秒,正好300只蜱。 SQL Server爲什麼以這種奇怪的方式計算每日時間的原因有歷史原因。據我瞭解,它可以追溯到Sybase SQL Server的日子以及早期Windows和OS/2 boxen上糟糕的時鐘分辨率。

鑑於這一切,你可以得到相同的數(自1900年以來天)這樣在C#:

public string SqlDate 
{ 
    get { return DaysSince1900(DateTime.Now).ToString() ; } 
} 

private int DaysSince1900(DateTime now) 
{ 
    TimeSpan period = now.Date - SqlServerEpoch ; 
    return period.Days ; 
} 
static readonly DateTime SqlServerEpoch = new DateTime(1900 , 1 , 1) ; 
1

類的隨機碼,但這樣做的:

void Main() 
{ 
    int n = NumberOfDays(DateTime.Now); 
    Console.WriteLine(n); 
} 

static int NumberOfDays(DateTime date) 
{ 
    DateTime start = DateTime.Parse("12/31/1899"); 
    TimeSpan t = date - start; 
    return (int)t.TotalDays; 
} 

Bascially,鑄造爲int似乎給出了從12/31/1899開始的天數。

作爲一個方面說明,這似乎不是一件好事情依賴或使用。

0

在t-sql中GetDate()返回一個日期時間,它將日期存儲爲自01/01/1753以來的天數,時間作爲一天的小數部分存儲。

因此Select Cast(GetDate() as int)將返回的天數,因爲1/1/1900

與此相反,C#結構存儲的日期時間以來01/01/0001的天數加上時間的分數部分天。

因此,爲了在兩者之間轉換,你只需要考慮01/01/0001 01/01/1900和

之間的天數偏移或者,如果你不想工作偏移量,並且您使用的是SQL Server 2008或更高版本,則可以使用SYSDATETIME()替換GETDATE()函數,該函數返回也用作參考01/01/0001的datetime2,以便引用c#date和t-sql日期到同一個數據,所以他們在同一個日期時轉換爲一個int時給出相同的數字。

+0

你得到的天數是** epoch **(1900年1月1日)以來的天數,* not *自1753年1月1日以來的天數。該日期只是SQL Server可以表示的最小日期。雖然可以表示較早的日期,但由於從Julian到Gregorian日曆的轉換,該日期被選爲截止日期。即使這樣也不準確,因爲不同的國家(甚至城市)在不同的時代都會改變。例如,俄羅斯直到1918年和希臘,直到1924年才改變!在不知道區域設置的情況下,從Julian到Gregorian日曆的*準確*轉換是不可能的。 –