Конвертировать значение BigInt в SQL в datetime в c # - PullRequest
0 голосов
/ 05 мая 2011

Обычно я использую приведенную ниже функцию SQL для преобразования bigint в sql в datetime в SQL Server 2005.

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 #?Я могу прочитать значение времени (129471410567460000) с сервера SQL и хочу преобразовать в datetime.Дата и время будут использоваться в приложении ac #.

Cheers

Ответы [ 5 ]

4 голосов
/ 05 мая 2011

Вы пытаетесь преобразовать bigint в SQL Server в дату и время в C # ?Если это так, вы должны сделать что-то вроде:

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

Если, однако, вы пытаетесь преобразовать значение bigint в SQL Server в значение datetime в SQL Server, тогда посмотрите следующую ссылку:

Преобразование .NET-тиков в 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: она хранит дату в виде интервалов 100 наносекунд с 1601 .Если это так, то код, который вы будете использовать в C #:

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

Вы заметите, что это значение возвращает 2003-05-14 4:51:56 PM, что является приблизительной датой и временем ветки форума.

1 голос
/ 06 мая 2011

Решение

DateTime.FromFileTimeUtc()
0 голосов
/ 21 сентября 2016
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 голосов
/ 05 мая 2011

Попробуйте это:

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


DateTime dt = DateTime.MinValue.AddDays(day).AddMilliseconds(ms);
0 голосов
/ 05 мая 2011

Вы можете сделать это хранимой процедурой, а затем вызвать ее из C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...