2011-05-05 47 views
0

我平時2005在SQL轉換BigInt有值,日期時間在C#

DECLARE @datetime AS bigint, @day AS int, @ms AS int 
SET @datetime = 129471410567460000 
SET @ms = (@datetime/CAST(10000 AS bigint)) % 86400000 
SET @day = @datetime/CAST(864000000000 AS bigint) - 109207 
SELECT DATEADD(ms,@ms, DATEADD(day, @day, 0)) 

我怎麼辦使用C#它使用下面的SQL函數BIGINT轉換成SQL以日期時間在SQL Server?我能夠從SQL服務器讀取時間值(129471410567460000),並希望轉換爲日期時間。日期時間將用於c#應用程序。

乾杯

+0

順便說一句,你的刻度值似乎非常低。例如,我今天獲得的價格值是634401513869130569. – Thomas 2011-05-05 07:17:07

+0

您的bigint值代表什麼? – V4Vendetta 2011-05-05 07:18:39

回答

1

解決方案是

DateTime.FromFileTimeUtc() 
+0

此解決方案適用於任何人嗎? – Newbee 2014-06-30 13:39:25

0

你可以使它成爲一個存儲過程,然後從C#調用它。

+0

他的問題是如何在C#中執行此操作。 – V4Vendetta 2011-05-05 07:11:37

+0

我的應用程序沒有訪問數據庫的權限。需要在C# – ove 2011-05-05 07:25:57

4

您是否試圖將SQL Server中的bigint轉換爲C#中的日期時間?但是,如果你是綁在SQL Server中的BIGINT值轉換爲SQL Server中的日期時間值,那麼看看下面的鏈接

var tickValue = 129471410567460000; 
var datetime = new DateTime(tickValue); 

Convert .NET Ticks to SQL Server DateTime

如果是的話,你會做這樣的事情

如果你想模仿你確切的邏輯(你是如何得到那個刻度值是自身的神祕):

var tickValue = 129471410567460000; 
var ms = (tickValue/10000) % 86400000; 
var day = tickValue/864000000000 - 109207; 

var startDate = new DateTime(1900, 1, 1); 
var resultDateTime = startDate.AddMilliseconds(ms).AddDays(day); 

訣竅這種邏輯是開始日期。在SQL Server中,零天=「1900-01-01」即使DateTime值可以存儲值追溯到1753


在評論,你提到的SQL方法被張貼在一個論壇。瞭解用於計算bigint值的方法至關重要。該論壇似乎暗示此值爲Win32 FILETIME結構:自1601以來存儲日期爲100納秒的時間間隔。如果是這樣的話,你會在C#中使用的代碼是:

var startDate = new DateTime(1601, 1, 1); 
var resultDateTime = startDate.AddTicks(tickValue); 

你會注意到,這個值返回2003-05-14 4:51:56 PM這是該論壇帖子的大概日期和時間。

+0

這給了我一個無效的值..試過.. 任何想法? – ove 2011-05-05 07:25:18

+0

@overule - 你怎麼得到那個刻度值?它是如何確定的?它絕對不等於.NET tick值。也就是說,我已經發布了一個示例,說明將C#中的等價物提供給您的T-SQL代碼的功能。 – Thomas 2011-05-05 07:30:38

+0

在sql中,這是一個bigint列,所以使用相同的邏輯轉換回日期時間 – ove 2011-05-05 07:32:51

0

試試這個:

long datetime = 129471410567460000; 
int ms = (int)((datetime/10000) % 86400000); 
int day = (int)(datetime/864000000000L) - 109207; 


DateTime dt = DateTime.MinValue.AddDays(day).AddMilliseconds(ms); 
+1

(不確定DateTime.MinValue是否是正確的起點) – Nathan 2011-05-05 07:18:13

+0

這看起來不錯,但它足夠準確嗎?歡呼 – ove 2011-05-05 07:28:54

+0

好吧,它和原來的功能一樣精確。正如你所看到的那樣,精確到毫秒而不是滴答聲。 – Nathan 2011-05-05 07:36:47

0
public DateTime ConvertLongFormate2DateTime(long iDatelongValue) 
{ 
    try 
    { 
     var iSecondCal = (iDatelongValue/1000 + 8 * 60 * 60); 
     var startDate = new DateTime(1970, 01, 01); 
     DateTime resultDateTime = startDate.AddSeconds(iSecondCal); 
     return resultDateTime; 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 
+0

一個liitle解釋不會傷害任何人。 – croxy 2016-09-21 06:16:20