将SQL中的BigInt值转换为c#中的datetime

时间:2011-05-05 07:02:15

标签: c# sql datetime

我通常使用下面的SQL函数将sql中的bigint转换为SQL Server 2005中的datetime。

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服务器读取时间值(129471410567460000)并想要转换为datetime。日期时间将在c#应用程序中使用。

干杯

5 个答案:

答案 0 :(得分:4)

您是否尝试将SQL Server中的bigint转换为C#中的日期时间?如果是这样,你会做类似的事情:

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

但是,如果您想将SQL Server中的bigint值转换为SQL Server中的日期时间值,请查看以下链接:

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中,第0天='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,这是论坛帖子的大致日期和时间。

答案 1 :(得分:1)

解决方案

DateTime.FromFileTimeUtc()

答案 2 :(得分:0)

您可以将其设为存储过程,然后从C#调用它。

答案 3 :(得分:0)

试试这个:

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


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

答案 4 :(得分: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;
    }
}