我通常使用下面的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#应用程序中使用。
干杯
答案 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;
}
}